1

我正在尝试用文字表达以下正则表达式。请注意,这与其说是一个编程正则表达式,不如说是我正在做的一些 CS 工作。正则表达式是:

(ab + b)* + (ba + b)*

空格没有意义,“+”用作“或”。我现在的回答是:

“这个正则表达式表示每个不包含子字符串'aa'的字符串,如果第一个字母是'a',则最后一个字母是'b'”

这个对吗?如果是这样,我提出的最后一个条件让我有点厌倦。有没有办法简化求和?

多谢你们。

4

2 回答 2

2

嗯,不确定我是否同意@ChristianTernus 的减少。

假设这些是隐式锚定的,(ab|b)*|(ba|b)*英文原文是:

  1. 完全aband组成的字符串b,或
  2. 完全ba和组成的字符串b

因此,例如,abb将匹配第一种但不匹配第二种,并且bba将匹配第二种但不匹配第一种。

同时,请注意既不abbbba不会匹配减少(ab)*|(ba)*|(b)*,这实际上意味着,

  1. 完全由 组成的字符串ab,或
  2. 完全由 组成的字符串ba,或
  3. 一个完全由 组成的字符串b

其实你英文化的方式,我觉得已经是最好的了!不过,我会这样设计:

此正则表达式表示一个完全由 'a' 和 'b' 组成的字符串,没有连续的 'a',如果第一个字符是 'a',则其最后一个字符是 'b'。

几乎和你已经写的一样。


正如@ChristianTernus(和@slebetman)指出的那样,上面没有考虑到原始表达式接受一个空字符串(甚至是一个没有'a'的字符串,这在我的英文化中并不清楚),所以事实上我相信OP的英语化确实是最强的。

于 2013-10-23T03:05:09.953 回答
1

(ab + b)* + (ba + b)*

翻译成通用(PCRE)正则表达式,即

(ab|b)*|(ba|b)*

换句话说:由零个或多个'ab'或'b'实例组成的字符串,或零个或多个'ba'或'b'实例组成的字符串。

@acheong87 的回答也是正确的。我喜欢这个,因为它更接近于正则表达式的原始结构——将它转换回它的正则表达式并不难。

于 2013-10-23T02:18:12.823 回答