【发布时间】:2015-04-07 13:55:54
【问题描述】:
嗨,我正在寻找一个正则表达式命令来匹配只有 2 个字母“a”或“A”的单词。单个 'a' 是可以的,但当单词包含 3 个或多个 'a' 并排在一起时,它就错了。
GAASSCC - 好
EAAASCS - 不好
AAASDAA - 不好
ASBSAA - 好
【问题讨论】:
嗨,我正在寻找一个正则表达式命令来匹配只有 2 个字母“a”或“A”的单词。单个 'a' 是可以的,但当单词包含 3 个或多个 'a' 并排在一起时,它就错了。
GAASSCC - 好
EAAASCS - 不好
AAASDAA - 不好
ASBSAA - 好
【问题讨论】:
在匹配每个单个字符之前检查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
【讨论】:
您可以使用以下方法过滤掉所有连续至少有 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 的单词。
【讨论】:
也许这会起作用:
[^aA]*[aA]{2}[^aA]*
【讨论】: