我已经尝试了一段时间来匹配以下情况,但我对正则表达式不是很好,希望能得到一些帮助......
我需要匹配包含 a 或 b 的所有单词,但每个 a 都需要用 b 分隔,因此任何单词中都没有 aa。
接受的词: a、b、ba、abbabaa
不接受的词: aa、babaa
我已经尝试了一段时间来匹配以下情况,但我对正则表达式不是很好,希望能得到一些帮助......
我需要匹配包含 a 或 b 的所有单词,但每个 a 都需要用 b 分隔,因此任何单词中都没有 aa。
接受的词: a、b、ba、abbabaa
不接受的词: aa、babaa
使用锚定的负面展望:
^(?!.*aa)[ab]+$
该表达式[ab]+
表示字符串由 a 和 b 组成(非常简单)。
(?!.*aa)
以 开头的表达式^
断言“aa”不会出现在输入中的任何位置。
要解决它而不向前看:
^(b|ab|a$)+$
一起使用的术语or
以从左到右的偏好使用。考虑到这一点,正则表达式的工作原理应该很明显。
在现场演示中查看此正则表达式
/^a?(ba?)*$/
解释...
/^ # start regex and start of string
a? # optional a
( # start group
b # exactly one b
a? # optional a
)* # end group, and repeat zero or more times
$/ # end regex and end of string
在简单的英语中,第一个字符可以是 an a
,或者向右移动到主要重复组,它可以重复零次或多次,并匹配 ab
后跟零或一个a
,直到结束。
(根据评论避免灾难性的回溯)
/^a?(b|ba)*$/
解释...
/^ # start regex and start of string
a? # optional a
( # start group
b|ba # match `b` or `ba`
)* # end group, and repeat zero or more times
$/ # end regex and end of string
在简单的英语中,第一个字符是a
, or 移动到主要重复组,该组重复零次或多次,由b
or组成ba
,然后结束匹配和正则表达式。
理想的 RE 是这样的:
^a?(b+a)*b*$
关键是它是一个简单的RE,可以在一次扫描中匹配或拒绝,没有回溯。