【问题标题】:Regex too have certain letters and at least one of a certain group of letters正则表达式也有某些字母和某些字母组中的至少一个
【发布时间】:2011-09-05 20:52:40
【问题描述】:

有人可以帮助我使用正则表达式来查找使用此规则的语句吗?

单词需要有字母“J、U、G”(只是字母不是顺序)和至少一个这些字母:G、L、E、R、S

所以我可以在列表中搜索 jugs、juggler、jugglers、juggles 等。

谢谢

【问题讨论】:

  • 但是您的示例 lugger 没有所有 JUG
  • 没有意义。 need to have 和 atleast one of 有什么区别?为什么两者都有 G?
  • ...您编辑的帖子包括gurgle,也不包括JUG...

标签: java regex search letter


【解决方案1】:

还有一个正则表达式解决方案。但是你真的应该给出你正在使用的语言,因为正如@Quick Joe Smith 所写的那样,对于你的任务可能还有其他更好的解决方案。

^(?=.*J)(?=.*U)(?=.*G)(?=.*[LERS]).*$

Rubular

那些(?=) 是积极的前瞻,他们检查字符串中是否有字符但他们不匹配。然后,末尾的 .* 将匹配您的完整字符串。

您还需要修饰符i 来开启忽略大小写(不区分大小写)

【讨论】:

    【解决方案2】:

    您问题的第一部分根本不适合正则表达式。该模式最终会变得一团糟,并且只会随着您添加更多必需的字符而变得更糟。

    然而,第二部分是微不足道的:

    m/[glers]/i
    

    所以我建议分两部分实施解决方案。这取决于您的语言:

    C#(使用 Linq)

    var chars = "GJU"; // characters are sorted.
    if (inputstring.ToUpper().Intersect(chars).OrderBy(c => c).SequenceEqual(chars)) {
        // do stuff if match.
    }
    

    Perl(需要 5.10)

    my @chars = sort split '', 'GJU'; # Transform into sorted array.
    my %input = map{($_, 1)} split '', uc $inputstring; # stores unique chars from string.
    if (@chars ~~ %input) { # Smart match performs hash key intersection.
        # Do stuff in here.
    }
    

    Python

    chars = set('jug')
    input = set(inputstring)
    if chars == (chars & input):
        # do something here
    

    【讨论】:

      【解决方案3】:

      如果您一次只使用一个单词,试试这个:

      boolean isMatch = s.matches(
        "(?i)^(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4");
      

      如果您在较长的字符串中搜索匹配项:

      Pattern p = Pattern.compile(
          "(?i)\\b(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+\\b\\1\\2\\3\\4");
      Matcher m = p.matcher(s);
      while (m.find()) {
          String foundString = m.group();
      } 
      

      每次前四个选项之一 - J()U()G()[GLERS]() - 匹配某些内容时,其后面的空组“捕获”任何内容(即空字符串)。当到达字符串的末尾时,每个反向引用 - \1\2 等 - 尝试匹配其对应组匹配的相同内容:不再匹配。

      显然,这将永远成功;你总是可以匹配注意到。诀窍是如果其对应的组没有参与匹配,则反向引用甚至不会尝试匹配。也就是说,如果目标字符串中没有j,则J() 替代项中的() 永远不会参与其中。当正则表达式引擎稍后处理\1 反向引用时,它会立即报告失败,因为它知道该组没有参加比赛。

      这样,空组就像一个复选框,反向引用确保所有的复选框都被选中。不过,有一点皱纹。 G()[GLERS]() 替代项都可以匹配 g;当你需要他们时,你如何确保他们都参加比赛?我尝试的第一个正则表达式,

      "(?i)^(?:J()|U()|G()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4"
      

      ...未能匹配单词“jugg”,因为G() 替代方案同时使用了g[GLERS]() 从来没有机会参与。所以我添加了负前瞻 - (?!.*G) - 现在它只匹配 last g。如果我有三个可以匹配g 的替代方案,我必须将(?!.*G.*G) 添加到第一个,并将(?!.*G) 添加到第二个。但实际上,在我到达那一点之前,我可能会改用另一种方法(可能是一种不涉及正则表达式的方法)。 ;)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 2010-11-02
        • 2020-12-24
        相关资源
        最近更新 更多