Regex/Java。用 'aa' 序列匹配单词
Regex/Java. Match words with 'aa' sequence
您好,我正在寻找一个正则表达式命令来匹配只有 2 个字母 'a' 或 'A' 的单词。单个 'a' 是可以的,但是当单词包含 3 个或更多 'a' 并排在一起时,它是错误的。
GAASSCC - 好
EAAASCS - 差
AAASDAA - 不好
ASBSAA - 好
您可以过滤掉所有连续至少有 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]*
您好,我正在寻找一个正则表达式命令来匹配只有 2 个字母 'a' 或 'A' 的单词。单个 'a' 是可以的,但是当单词包含 3 个或更多 'a' 并排在一起时,它是错误的。
GAASSCC - 好
EAAASCS - 差
AAASDAA - 不好
ASBSAA - 好
您可以过滤掉所有连续至少有 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]*