我想知道如何检测除字母表中的字母之外的任何字符之间的单词。我需要这个,因为我正在为Java定制导入管理器。这是我已经尝试过的:
正则表达式:
[^(a-zA-Z)]InitializationEvent[^(a-zA-Z)]
我正在搜索“InitializationEvent”这个词。
我一直在测试的代码片段:
public void load(InitializationEvent event) {
在单词帮助之前添加空格似乎是字母范围内的括号?
我在我的程序中对此进行了测试,但它无效。我也在regexr.com上查看了它,显示了相同的结果 - 类名无法识别。
我做错了吗?我是正则表达式的新手,所以这可能是一个非常基本的错误,或者不是。让我知道!
答案 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])
是负面预测断言下一个位置没有字母答案 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中没有匹配