【问题标题】:Java regex predefined character class nested inside character classJava regex 预定义的字符类嵌套在字符类中
【发布时间】:2010-08-11 12:31:49
【问题描述】:

我需要使用包含除点之外的所有 \b 字符的正则表达式,.

类似[\b&&[^.]]

例如,在下面的测试字符串中:

"somewhere deep down in some org.argouml.swingext classes and"

我希望 org.argouml.swingext 字符串匹配,但 org.argouml 字符串不太匹配。 (使用Matcher.find()方法)

如果我使用:\b(package_name)>\b,它们都匹配,这不是我想要的。

如果我使用:\b(package_name)[\b&&[^\.]] 我会得到一个PatternSyntaxException

如果我使用:\b(package_name)(\b&&[^\.]) 没有匹配项。

我使用this link 来测试我的正则表达式。

上下文:我有一个项目中的包名称列表,我必须在一些文本中搜索它们。显然,如果找到嵌套包,我不希望外包也匹配,如上例所示。

我没有在末尾使用 \s 字符类,因为包可能位于行尾,或者它后面可能跟着其他非单词字符,例如 :) 等,包含的字符在\b 类中。我只想减去 .来自 \b 类。

如果有人知道如何做到这一点,我将非常感激 :) 谢谢

【问题讨论】:

  • "所有\b 字符" - \b 不是字符。这是一个零宽度的单词边界锚。

标签: java regex subtraction


【解决方案1】:

在这里可以使用负前瞻:

\borg.argouml(?!\.)\b

请记住,在 Java 字符串文字中,正则表达式中的反斜杠必须被转义:

"\\borg.argouml(?!\\.)\\b"

【讨论】:

    【解决方案2】:

    为什么不简单地使用:

    \b\w+(\.\w+)+\b
    

    仅供参考,PatternSyntaxException 会弹出,因为\b 匹配位置,而不是字符。字符类始终匹配 1 个字符,因此将 \b(单词边界)放在字符类中会引发异常。

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      相关资源
      最近更新 更多