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

3
我希望能够匹配并查找被空格或特殊字符包围的单词,并确定其索引位置。例如:
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]

这是一个不同的情况,因为在我的情况下,#test_应该返回test的索引而不是#test。 - Maxsteel
非字母数字。此外,在匹配时,我想要"test"的索引。所有其他示例都给出完全匹配! - Maxsteel
要获取索引,只需访问 matcher.start() - Wiktor Stribiżew
让我们在聊天中继续这个讨论 - Maxsteel
1
另外,由于您需要搜索词的索引,使用前后环视更容易- String pat = "(?<!\\p{Alnum})test(?!\\p{Alnum})"; - Wiktor Stribiżew
显示剩余4条评论
2个回答

5
我认为你在这种情况下需要使用“lookaround”。
(?<!\p{Alnum})test(?!\p{Alnum})

负向后瞻断言 (?<!\p{Alnum}) 如果在 test 左侧存在一个字母或数字,则匹配失败。负向前瞻断言 (?!\p{Alnum}) 如果在 test 右侧存在一个字母或数字,则匹配失败。
请参阅测试截图: enter image description here Java演示: http://ideone.com/MAXJg8
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演示
请注意,在这种情况下,\P{Alnum}是一个消耗模式,在某些边缘情况下,可能无法匹配test

虽然我在问题陈述中表达得不够清楚(很抱歉!),但这正是我想要的!非常感谢! - Maxsteel
对于那些只需要字母字符而不是字母数字的人,可以使用"(?<!\\p{Alpha})test(?!\\p{Alpha})" - Dat Nguyen
1
@DatNguyen:请注意,默认情况下\p{Alpha}仅与ASCII字符集中的字母匹配(如果您没有指定Pattern.UNICODE_CHARACTER_CLASS标志)。为了匹配任何Unicode字母而不依赖于标志,请使用"(?<!\\p{L})test(?!\\p{L})" - Wiktor Stribiżew
好的,知道了。谢谢@WiktorStribiżew! - Dat Nguyen

0

我只是想理解你的问题。你是在寻找被特殊字符(包括下划线)或空格所包围的test吗?但是你说this is#input_ : True。我不确定我是否理解错误,但在这种情况下,这是怎么成立的呢?

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

  • \W 匹配任何非单词字符
  • \s 匹配任何空白字符
  • _ 匹配任何下划线 - 必须单独定义,因为这是一个单词
  • 从我对提到的测试的困惑中,我让正则表达式搜索输入和测试两者

此外,每当我使用正则表达式时,我都会使用this网站,因为我觉得它非常有用。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接