我已经尝试了一段时间来匹配以下情况,但我不太擅长正则表达式,希望能得到一些帮助...
我需要匹配所有包含a或b的单词,但每个a都需要由b分隔开,因此任何单词中都不应出现aa。
接受的单词:a、b、ba、ababbaba
不接受的单词:aa、babaa
我已经尝试了一段时间来匹配以下情况,但我不太擅长正则表达式,希望能得到一些帮助...
我需要匹配所有包含a或b的单词,但每个a都需要由b分隔开,因此任何单词中都不应出现aa。
接受的单词:a、b、ba、ababbaba
不接受的单词:aa、babaa
^(?!.*aa)[ab]+$
[ab]+
表示字符串由 a 和 b 组成(非常直观)。
(?!.*aa)
这个表达式用 ^
锚定在开头,表示输入中没有 "aa" 出现。
不使用前瞻的解决方法:
^(b|ab|a$)+$
通过左到右的顺序, 一起使用的术语 or
将按顺序执行。有了这个想法,正则表达式的工作方式应该很明显。
在实时演示中查看此正则表达式的工作方式。
$
。 - georg/^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
简单来说,第一个字符可以是 a
,或者直接进入主要重复组,该组可以重复零次或多次,并匹配一个后面跟着零个或一个 a
的 b
,直到结尾。
(根据评论避免灾难性回溯)
/^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
,或者进入主要的重复组,该组可以重复零次或多次,并且由b
或ba
中的一个组成,然后结束匹配和正则表达式。
/^a?(b|ba)*$/
- Billy Moonb
后面删除了 +
,它已经没问题了... 不确定 b|ba
,重复的 b
可能不是最佳选择。 - Bergi理想的正则表达式如下:
^a?(b+a)*b*$
关键在于这是一个简单的正则表达式,可以在一次扫描中匹配或拒绝,没有回溯。
/^a?(ba?)*$/
。无论如何,在这个阶段选择它们之间的唯一方法是查看生成的NFA和DFA的状态图,而我宁愿过自己的生活。 (自动机状态图是我最不喜欢的事情之一,特别是当它们以某种奇怪的内部形式编码时。) - Donal Fellows