嗨,我正在寻找一个正则表达式命令来匹配只有2个字母'a'或'A'的单词。单个'a'是可以的,但是当单词包含3个或更多'a'时,它们是错的。正则表达式/ Java。用'aa'序列匹配单词
摹AA SSCC - 好
EAAASCS - 坏
AAASD AA - 坏
ASBS AA - 好
嗨,我正在寻找一个正则表达式命令来匹配只有2个字母'a'或'A'的单词。单个'a'是可以的,但是当单词包含3个或更多'a'时,它们是错的。正则表达式/ Java。用'aa'序列匹配单词
摹AA SSCC - 好
EAAASCS - 坏
AAASD AA - 坏
ASBS AA - 好
在匹配每个单个字符之前,检查是否为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]*