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

时间:2016-11-13 09:36:30

标签: 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.

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

2 个答案:

答案 0 :(得分:3)

我认为你需要在你的案例中使用外观:

(?<!\p{Alnum})test(?!\p{Alnum})

如果(?<!\p{Alnum})左侧存在字母数字字符,那么负面后瞻test将使匹配失败,如果存在,则否定前瞻(?!\p{Alnum})将使匹配失败test之后的字母数字字符。

查看测试截图:

enter image description here

Java demo

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());
}

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

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

请参阅此Java demo

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

答案 1 :(得分:0)

我只是想了解你的问题。您正在寻找被特殊字符(包含_)或空格包围的test? 但是你说this is#input_ : True。我不确定我是否选错了,但在那种情况下情况如何呢?

无论如何,我有正则表达式[\W\s_](input|test)[\W\s_],它匹配所有定义为true的情况。

  • \ W匹配任何非单词
  • \ s匹配任何空格
  • _匹配任何下划线 - 必须自己定义,因为这是一个单词
  • 从我提到的测试的混乱中,我有正则表达式搜索输入和测试

我也可以随时与Regex合作使用this网站,因为我发现它很有用。

不确定这是否是您要找的答案,但如果我错了就告诉我,我会再试一次