【问题标题】:Regex/Java. Match words with 'aa' sequence正则表达式/Java。匹配带有 'aa' 序列的单词
【发布时间】:2015-04-07 13:55:54
【问题描述】:

嗨,我正在寻找一个正则表达式命令来匹配只有 2 个字母“a”或“A”的单词。单个 'a' 是可以的,但当单词包含 3 个或多个 'a' 并排在一起时,它就错了。

GAASSCC - 好
EAAASCS - 不好
AAASDAA - 不好
ASBSAA - 好

【问题讨论】:

    标签: java regex contains


    【解决方案1】:

    在匹配每个单个字符之前检查aaa 的非。这可以通过否定前瞻断言来完成。

    String line[] = {"GAASSCC", "EAAASCS", "AAASDAA", "ASBSAA" };
    for (String i : line)
        if(i.matches("(?i)^(?:(?!aaa).)*?(?<!a)aa(?!a).*"))
        {
            System.out.println(i +" -> Good");
        }
        else
        {
            System.out.println(i +" -> Bad");
        }
    

    输出:

    GAASSCC -> Good
    EAAASCS -> Bad
    AAASDAA -> Bad
    ASBSAA -> Good
    

    说明:

    • (?i) 称为不区分大小写的修饰符。这使得正则表达式匹配大小写字母。

    • ^ 断言我们处于起步阶段。

    • (?:(?!aaa).)*? 棘手的部分来了。首先检查不是aaa。如果没有a 后面没有两个a 字符,则只会匹配相应的字符。

    • (?&lt;!a) 这断言我们要匹配的字符串前面不会有字符 a

    • aa 匹配字符串aa

    • (?!a) 否定前瞻,断言匹配后不会出现字符 a

    【讨论】:

      【解决方案2】:

      您可以使用以下方法过滤掉所有连续至少有 3 个 A 的单词:

      \b\w*[aA]{3,}\w*\b
      

      解释:

      \b:字边界。基本上是单词的开头或结尾。

      \w*: 任意数量的字母。所以零个或多个。

      [aA]: 要么 a 要么 A

      {3,}:前一个元素的三倍或更多倍 ([aA])

      所以这会找到所有连续至少有三个 A 的单词,周围有任意数量的其他字母。

      如果你想查找包含一个或两个 A 的单词,你可以将上面的内容修改为\b\w*[aA]{1, 2}\w*\b。事实上,您也可以使用\b\w*[aA]+\w*\b,因为您已经过滤掉了三个或更多 A 的单词。

      【讨论】:

        【解决方案3】:

        也许这会起作用:

        [^aA]*[aA]{2}[^aA]*
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-03
          • 2015-04-13
          • 2023-04-01
          • 1970-01-01
          相关资源
          最近更新 更多