我试图用文字表达以下正则表达式。请注意,这不是一个编程正则表达式,而是与我正在做的一些CS工作相反。正则表达式是:
(ab + b)* + (ba + b)*
空格无意义,'+'表示'或'。我现在的回答是:
“此正则表达式表示不包含子字符串'aa'的每个字符串,如果第一个字母为'a',则其最后一个字母为'b'”
这是对的吗?如果是这样,我提出的最后一个条件让我有点疲惫。有没有办法可以简化求和?
谢谢你们。
答案 0 :(得分:2)
假设这些是隐式锚定的,原文(ab|b)*|(ba|b)*
用英文表示:
ab
和b
或ba
和b
组成的字符串完全。因此,例如,abb
将匹配第一种但不匹配第二种,bba
将匹配第二种但不匹配第一种。
与此同时,请注意abb
和bba
与减少量(ab)*|(ba)*|(b)*
无关,实际上意味着,
ab
。实际上,你认识它的方式,我认为已经是最好的了!虽然,我的风格是这样的:
这个正则表达式表示一个完全由'a'和'b'组成的字符串,没有连续的'a',如果第一个字符是'a',则其最后一个字符是'b'。
几乎与你已写的相同。
正如@ChristianTernus(和@slebetman)指出的那样,上面没有考虑到原始表达式接受一个空字符串(或者甚至是没有'a'的字符串,这在我的英语化中是不明确的),所以在事实上,我认为OP的英语化确实是最强的。
答案 1 :(得分:1)
(ab + b)* + (ba + b)*
转换为普通(PCRE)正则表达式,即
(ab|b)*|(ba|b)*
换句话说:由零个或多个“ab”或“b”实例组成的字符串,或“ba”或“b”的零个或多个实例。
@ acheong87的回答也是正确的。我喜欢这个,因为它与正则表达式的原始结构更紧密地匹配 - 不难将它转回正则表达式的正则表达式。