【问题标题】:Regex to match word surrounded by non-alphanumeric characters正则表达式匹配由非字母数字字符包围的单词
【发布时间】:2017-03-27 03:03:41
【问题描述】:

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

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。
  • _ 是一个单词,而不是特殊字符。另外this is#input_不能是Truetest这个词在哪里?您的测试用例中缺少 #test_
  • *非字母数字。此外,在一场比赛中,我想要“测试”的索引。所有其他示例都给出了完全匹配!
  • @WiktorStribiżew 等等,'_' 不是字符?
  • 另外,由于需要搜索词的索引,所以使用lookarounds更容易-String pat = "(?<!\\p{Alnum})test(?!\\p{Alnum})";

标签: java regex string


【解决方案1】:

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

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

如果test 的左侧有一个字母数字字符,则负向后向(?&lt;!\p{Alnum}) 将失败匹配,如果@987654329 之后有一个字母数字字符,则负向先行(?!\p{Alnum}) 将失败匹配@。

查看测试截图:

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 可能无法匹配。

【讨论】:

  • 虽然我的问题不是很清楚(很抱歉!),但这正是我想要的!非常感谢!
  • 只需要字母而不需要字母数字的可以使用"(?&lt;!\\p{Alpha})test(?!\\p{Alpha})"
  • @DatNguyen:请注意,\p{Alpha} 默认情况下仅适用于 ASCII 字母(如果您未指定 Pattern.UNICODE_CHARACTER_CLASS 标志)。要匹配任何 Unicode 字母而不依赖于标志,请使用 "(?&lt;!\\p{L})test(?!\\p{L})"
  • 很高兴知道。谢谢@WiktorStribiżew!
【解决方案2】:

我只是想了解您的问题。您正在寻找被特殊字符(包括_)或空格包围的test? 但是你说this is#input_ : True。我不确定我是否理解错了,但在这种情况下这是怎么回事?

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

  • \W 匹配任何非单词
  • \s 匹配任何空格
  • _ 匹配任何下划线 - 必须单独定义,因为这是一个单词
  • 由于我对上述测试的困惑,我使用正则表达式搜索输入和测试

我也使用 this 网站,因为我发现它非常有用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多