Regex/Java。用 'aa' 序列匹配单词

Regex/Java. Match words with 'aa' sequence

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

GA​​ASSCC - 好
EAAASCS - 差
AAASDA​​A - 不好
ASBSA​​A - 好

您可以过滤掉所有连续至少有 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 的单词。

在匹配每个单个字符之前检查 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 字符,则只会匹配相应的字符。

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

  • aa 匹配字符串 aa

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

也许这会奏效:

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