我正在尝试用文字表达以下正则表达式。请注意,这与其说是一个编程正则表达式,不如说是我正在做的一些 CS 工作。正则表达式是:
(ab + b)* + (ba + b)*
空格没有意义,“+”用作“或”。我现在的回答是:
“这个正则表达式表示每个不包含子字符串'aa'的字符串,如果第一个字母是'a',则最后一个字母是'b'”
这个对吗?如果是这样,我提出的最后一个条件让我有点厌倦。有没有办法简化求和?
多谢你们。
我正在尝试用文字表达以下正则表达式。请注意,这与其说是一个编程正则表达式,不如说是我正在做的一些 CS 工作。正则表达式是:
(ab + b)* + (ba + b)*
空格没有意义,“+”用作“或”。我现在的回答是:
“这个正则表达式表示每个不包含子字符串'aa'的字符串,如果第一个字母是'a',则最后一个字母是'b'”
这个对吗?如果是这样,我提出的最后一个条件让我有点厌倦。有没有办法简化求和?
多谢你们。
嗯,不确定我是否同意@ChristianTernus 的减少。
假设这些是隐式锚定的,(ab|b)*|(ba|b)*
英文原文是:
ab
and组成的字符串b
,或ba
和组成的字符串b
。因此,例如,abb
将匹配第一种但不匹配第二种,并且bba
将匹配第二种但不匹配第一种。
同时,请注意既不abb
也bba
不会匹配减少(ab)*|(ba)*|(b)*
,这实际上意味着,
ab
,或ba
,或b
。其实你英文化的方式,我觉得已经是最好的了!不过,我会这样设计:
此正则表达式表示一个完全由 'a' 和 'b' 组成的字符串,没有连续的 'a',如果第一个字符是 'a',则其最后一个字符是 'b'。
几乎和你已经写的一样。
正如@ChristianTernus(和@slebetman)指出的那样,上面没有考虑到原始表达式接受一个空字符串(甚至是一个没有'a'的字符串,这在我的英文化中并不清楚),所以事实上我相信OP的英语化确实是最强的。
(ab + b)* + (ba + b)*
翻译成通用(PCRE)正则表达式,即
(ab|b)*|(ba|b)*
换句话说:由零个或多个'ab'或'b'实例组成的字符串,或零个或多个'ba'或'b'实例组成的字符串。
@acheong87 的回答也是正确的。我喜欢这个,因为它更接近于正则表达式的原始结构——将它转换回它的正则表达式并不难。