正则表达式匹配被非字母数字字符包围的单词

Max*_*eel 3 java regex string

我想匹配和查找被空格或特殊字符包围的单词索引。例如:

To find: test
this is input test : True
this is#input_ : True
this isinput : False
thisisinputtest: False
this @test is right: True.
Run Code Online (Sandbox Code Playgroud)

我如何匹配它并找到索引。我当前的正则表达式失败:(?i)[^a-zA-Z0-9]test[^a-zA-Z0-9]

Wik*_*żew 5

我认为你需要在你的情况下使用环视:

(?<!\p{Alnum})test(?!\p{Alnum})
Run Code Online (Sandbox Code Playgroud)

负回顾后(?<!\p{Alnum}) ,如果有存在于左边的字母数字字符会失败的比赛test,负前瞻(?!\p{Alnum}),如果之后有一个字母数字字符将失败的比赛test

看测试截图:

在此处输入图片说明

Java演示

String str = "this is#test_ :";
Pattern ptrn = Pattern.compile("(?<!\\p{Alnum})test(?!\\p{Alnum})");
Matcher matcher = ptrn.matcher(str);
while (matcher.find()) {
    System.out.println(matcher.start());
}
Run Code Online (Sandbox Code Playgroud)

替代方法:匹配并捕获搜索词,并打印第一个捕获组的起始位置:

Pattern ptrn = Pattern.compile("\\P{Alnum}(test)\\P{Alnum}");
...
System.out.println(matcher.start(1));
Run Code Online (Sandbox Code Playgroud)

请参阅此Java 演示

请注意,在这种情况下,这\P{Alnum}是一个消耗模式,在某些边缘情况下,test可能无法匹配。