3

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

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

接受的词: a、b、ba、abbabaa
不接受的词: aa、babaa

4

4 回答 4

4

使用锚定的负面展望:

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

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

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


要解决它而不向前看:

^(b|ab|a$)+$

一起使用的术语or以从左到右的偏好使用。考虑到这一点,正则表达式的工作原理应该很明显。

在现场演示中查看此正则表达式

于 2013-09-09T09:58:47.723 回答
3
/^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 移动到主要重复组,该组重复零次或多次,由bor组成ba,然后结束匹配和正则表达式。

于 2013-09-09T10:30:18.347 回答
2

理想的 RE 是这样的:

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

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

于 2013-09-09T10:40:32.683 回答
0

检查这是否适合您。\b((a?b+a?)+)\b|\b((a?b+)+)\b|\b(((b+a?)*)\b)

我没有时间验证所有可能的情况。

您可以使用此在线正则表达式在线验证器

干杯

于 2013-09-09T11:06:17.467 回答