2016-11-13 717 views
1

我想匹配并查找由空格或特殊字符包围的单词的索引。例如:正则表达式匹配包含非字母数字字符的单词

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]

+0

这是一个不同的情况下,因为在我的情况,#test_应该返回测试指标并不#TEST 。 – Maxsteel

+0

“_”是一个单词,不是特殊字符。此外,'这是#input_'不能是'True',那里有'test'这个词在那里?测试用例中缺少'#test_'。 –

+0

*非字母数字。此外,在一场比赛中,我想要“测试”的索引。所有其他的例子给出了完整的匹配! – Maxsteel

回答

2

我想你需要什么你的情况使用lookarounds:

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

负回顾后(?<!\p{Alnum})将失败的比赛,如果有存在的test左边的字母数字字符,并且如果在test之后存在字母数字字符,则否定前瞻(?!\p{Alnum})将会使匹配失败。

见测试截图:

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

替代办法:比赛和捕捉到的搜索词,并打印1日开始位置捕获组:

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

看到这个Java demo

注意,在这种情况下,\P{Alnum}消费模式,并在一些边缘情况,test可能不会得到匹配。

+0

虽然我不清楚这个问题(对不起!),这正是我想要的!非常感谢! – Maxsteel

+0

对于那些只需要字母字符而非字母数字的人,可以使用'“(?<!\\ p {Alpha})test(?!\\ p {Alpha})”' –

+1

@DatNguyen:注意'\ p {Alpha}默认情况下仅使用ASCII字母(如果您未指定'Pattern.UNICODE_CHARACTER_CLASS'标志)。要匹配任何Unicode字母而不依赖于标志,请使用'“(?<!\\ p {L})test(?!\\ p {L})”'。 –

0

我只是想了解你的问题。您正在寻找被特殊角色(包含)或空间包围的test? 但你说this is#input_ : True。我不确定我是否挑选了这个错误,但在那种情况下如何是真的?

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

  • \ W匹配任何非单词
  • \ s任何空白
  • _匹配任何下划线匹配 - 必须建立在自己的定义,因为这是一个字
  • 从我所提到的试验的困惑我有正则表达式搜索输入和测试

此外我用户this网站随时与我正确的工作,因为我觉得它非常有用。

不知道这是你想要的答案,但让我知道,如果我错了,我会再试一次

相关问题