正则表达式匹配由b分隔的a

时间:2013-09-09 09:56:30

标签: regex

我已经尝试了一段时间来匹配以下情况,但我对正则表达式并不是那么好,希望能有一些帮助......

我需要匹配包含a或b的所有单词,但每个单词需要用b分隔,所以在任何单词中都没有aa。

接受的词语: a,b,ba,ababbaba
不接受的字词: aa,babaa

4 个答案:

答案 0 :(得分:3)

使用锚定的负面展望:

^(?!.*aa)[ab]+$

表达式[ab]+表示字符串由a和b组成(非常简单)。

表达式(?!.*aa),以^为开头,断言“aa”不会出现在输入中的任何位置。


无需预见即可解决问题:

^(b|ab|a$)+$

条款or ed在左右首选项中使用。考虑到这一点,正则表达式应该如何运作。

live demo

中查看此正则表达式

答案 1 :(得分:2)

/^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,或者向右移动到主重复组,可以重复零次或多次,并匹配b后跟零或一个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,或者移到主重复组,重复组重复零次或多次,由bba组成,然后结束匹配和正则表达式。

答案 2 :(得分:1)

理想的RE就是:

^a?(b+a)*b*$

关键是它是一个简单的RE,可以在一次扫描中匹配或拒绝,没有回溯。

答案 3 :(得分:0)

检查这是否适合您。 \ B(?(A B + A)+?)\ C | \ B((A B +)+?)\ C | \ B(((B + A)*)\ b)中

我没有时间核实每一个可能的案例。

您可以在线使用Regular Expressions Online verifier

干杯