【问题标题】:Regex for finding exact words用于查找确切单词的正则表达式
【发布时间】:2015-05-22 17:13:57
【问题描述】:

我正在寻找一个正则表达式,它只会给我包含我指定的字母的单词,并且匹配单词的长度应该与指定的字符数相同。

因此,如果我给字母 OMHE 它应该只匹配包含这些字母的单词,并且只匹配包含这些字母的单词,以及该字母在字母序列中出现的次数

到目前为止,这个具体示例的正则表达式是(否则我会动态构建正则表达式)...

.*?[O{1}M{1}H{1}E{1}]{4}

它在某种程度上确实有效,但我确实得到了一些不应该匹配的单词。 该示例应该匹配的单词是HOME,但MEMOHOMEE 不应该匹配。在正则表达式方面我真的很糟糕:(

【问题讨论】:

  • 查找词:'包含这些字符中的任何一个'或'包含所有这些字符'?
  • {1} 在字符类中失去其特殊含义,因此您的正则表达式等同于 .*?[OHME}{1]{4}
  • @Yousef's 它应该包含所有这些字符
  • 以后Java实现条件的时候可以用这个\b(?:(?>((?(1)(?!))H)|((?(2)(?!))M)|((?(3)(?!))O)|((?(4)(?!))E))){4}\b
  • 由于 Java 不执行条件语句,如果您尝试在字符串中查找 所有 个单词,那么唯一的方法就是进行排列。

标签: java regex


【解决方案1】:

您可以使用这个基于前瞻的正则表达式:

^(?=.*?O)(?=.*?M)(?=.*?H)(?=.*?E)[OMHE]{4}$

RegEx Demo

【讨论】:

  • 我认为 OP 只想要 4 个字母的单词,这就是为什么我有 [OMHE]{4}
  • 通过更改为 ^(?=.*?O{1})(?=.*?M{1})(?=.*?H{1})(?=. *?E{1})[OMHE]{4}$ 非常适合我的需求。它只需要确保字母只出现指定的次数。
  • 这永远无法在字符串中找到多个单词。真的有点没用。
  • @sln 它不必解析整个字符串。它仅用于字典中的单个单词。
  • @JohannvanEeden - 在这种情况下,您不需要正则表达式,只需检查每个字符,在找到的每个字母上设置一个标志。
【解决方案2】:

您可以使用^(([OMHE])(?!.*\2)){4}$

它使用否定前瞻的说法,即在捕获[OMHE] 的每个匹配项后,不允许出现其他捕获的文本。然后,需要重复四次。由于外部组仅用于定义重复,因此可以将其优化为非捕获组:

^(?:([OMHE])(?!.*\1)){4}$

很容易将其扩展到更多字符...

【讨论】:

    【解决方案3】:

    你可以使用这个模式

    (O|M|H|E){4}
    

    【讨论】:

    • 这也将匹配 HOMEE,它不应该
    • 试试这个^(O|M|H|E){4}$
    • 那不会有影响
    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2021-12-30
    相关资源
    最近更新 更多