【问题标题】:Regex testing negative pattern more than one word正则表达式测试否定模式超过一个词
【发布时间】:2013-12-10 12:01:24
【问题描述】:

我正在尝试匹配文本中不包含两个单词的字符串文本。这些词是ueui。我已经开始使用一个词,然后再转向一个或另一个词,但我不能只用一个词。这是我迄今为止尝试过的:

^(?!ue)[A-Za-z\s]+(?<!ue)$

这在ue 位于测试字符串的开头或结尾时有效。所以在这样的情况下:

this is ue
ue is this

但不是在这种情况下,上面的正则表达式返回我不想要的 true:

is ue really here

此外,我想避免将ue 匹配为另一个字符串的一部分,例如下面的示例:

this is not supposed toue match

我不想将其与正则表达式匹配,而是改为:

this is not supposed to ue match

区别在于ue 是独立词。如何修复上面的正则表达式?

【问题讨论】:

  • 有什么特殊原因必须将其作为单个正则表达式测试来完成吗?
  • 是的,我正在使用接受正则表达式的第三方软件的评估器。否则我会用正则表达式以外的东西来做

标签: java regex


【解决方案1】:

最简单的方法是使用负前瞻:

^(?!.*\\bu[ei]\\b).*$   # use with singleline/dotall mode

另一种方式(更高效):

^(?>[^u]++|\\Bu|u(?![ei]\\b))*$

【讨论】:

    【解决方案2】:
    String regex = "(?:\\bue\\b|\\bui\\b)"
    

    \\b 是一个boundary matcher 用于单词边界。这将匹配包含独立的ueui 的任何字符串。

    这可以简化为:

    String regex = "\\bu[ie]\\b"
    

    @Casimir 的方法仅在您必须使用整个区域进行匹配时才需要,例如Matcher.matches();但是,如果您使用 Matcher.find() 之类的东西,这会更简单、更快。

    【讨论】:

      【解决方案3】:

      你能不能把 + 改成 *,这样它就可以处理没有相邻的字符了?

      只做一个 string.contains("ue") 不是更容易吗??

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        • 2016-09-06
        • 1970-01-01
        • 2013-06-01
        • 2017-03-09
        相关资源
        最近更新 更多