正则表达式匹配除字母

时间:2016-06-24 18:00:18

标签: java regex

我想知道如何检测除字母表中的字母之外的任何字符之间的单词。我需要这个,因为我正在为Java定制导入管理器。这是我已经尝试过的:

正则表达式:

[^(a-zA-Z)]InitializationEvent[^(a-zA-Z)]

我正在搜索“InitializationEvent”这个词。

我一直在测试的代码片段:

public void load(InitializationEvent event) {

在单词帮助之前添加空格似乎是字母范围内的括号?

我在我的程序中对此进行了测试,但它无效。我也在regexr.com上查看了它,显示了相同的结果 - 类名无法识别。

我做错了吗?我是正则表达式的新手,所以这可能是一个非常基本的错误,或者不是。让我知道!

5 个答案:

答案 0 :(得分:4)

丢失括号:

[^a-zA-Z]InitializationEvent[^a-zA-Z]

[]内,从字面上理解括号,并通过反转组(^)阻止其匹配,因为(在字符串中位于InitializationEvent之前。

但请注意,上述正则表达式只会匹配测试字符串末尾的 。为此,您可以使用:

InitializationEvent

或者,不创建任何匹配的组(应该更干净,性能更好):

(^|[^a-zA-Z])InitializationEvent([^a-zA-Z]|$)

答案 1 :(得分:2)

  

如何检测除字母表中的字母之外的任何字符之间的单词

这是lookarounds派上用场的情况。您可以使用:

(?<![a-zA-Z])InitializationEvent(?![a-zA-Z])
  • (?<![a-zA-Z])是负面的后视,断言前一个位置没有字母
  • (?![a-zA-Z])是负面预测断言下一个位置没有字母

RegEx Demo

答案 2 :(得分:1)

你似乎很亲密:

[^(a-zA-Z)]*(InitializationEvent)[^(a-zA-Z)]*

我认为这就是你要找的东西。星号为其前面的零个或多个字符或组提供匹配。

EDIT / UPDATE

我对最初的回应道歉。

[^a-zA-Z]+(InitializationEvent)[^a-zA-Z]+

我的正则表达式有点生疏,但在InitializationEvent之前和之后,这将匹配任何非字母字符一次或多次。

答案 3 :(得分:1)

括号引起问题,只是跳过它们:

"[^a-zA-Z]InitializationEvent[^a-zA-Z]"

或使用略有不同的预定义非单词字符类,因为它也排除了数字和下划线:

 "\\WInitializationEvent\\W"

但是因为看起来你想匹配一个类名,所以这可能没问题,因为剩下的字符正是类名中允许的字符。

答案 4 :(得分:1)

我不确定您的应用程序,但从正则表达式的角度来看,您可以使用负向前瞻和负向外观来定义不能围绕String指定匹配的内容。

我添加了否定前瞻(?![a-zA-Z])以及否定后瞻(?<![a-zA-Z])代替最初提供的[^(a-zA-Z)]来创建:(?<![a-zA-Z])InitializationEvent(?![a-zA-Z])

我创建了快速小提琴:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HelloWorld{

 public static void main(String []args){
    String pattern = "(?<![a-zA-Z])InitializationEvent(?![a-zA-Z])";
    String sourceString = "public void load(InitializationEvent event) {";
    String sourceString2 = "public void load(BInitializationEventA event) {";

    Pattern r = Pattern.compile(pattern);

    Matcher m = r.matcher(sourceString);
  if (m.find( )) {
     System.out.println("Found value of pattern in sourceString: " + m.group(0) );
  } else {
     System.out.println("NO MATCH in sourceString");
  }

   Matcher m2 = r.matcher(sourceString2);
  if (m2.find( )) {
     System.out.println("Found value of pattern in sourceString2: " + m2.group(0) );
  } else {
     System.out.println("NO MATCH in sourceString2");
  }
 }

}

输出:

  

sh-4.3 $ java -Xmx128M -Xms16M HelloWorld
  在sourceString中找到模式的值:InitializationEvent
  sourceString2中没有匹配