【问题标题】:Build regular expression构建正则表达式
【发布时间】:2021-12-04 09:04:45
【问题描述】:
我需要为其中 +/- 字符不能并排(必须由其他字符分隔)的字符串构建正则表达式。我得到了这个选项:(a*(+|-)a)*,其中a 是任何字符,* 是 Kleene 闭包,() 是为了清楚起见。但是这个表达式不能识别以下形式的行:“+”、“-”、“+ a-”等。也许有人能把我从死点上移开。我需要规律性来构建一个有限自动机。
【问题讨论】:
标签:
regular-language
finite-automata
【解决方案1】:
可能会这样:
^(\+(?![\+-])|-(?![\+-])|[^\+-])*?$
它将所有内容限制在一行:^ 到 $。惰性量词()*? 确保不会超过一行被识别。
括号内的3个连接如下:
-
\+(?![\+-]) 如果字符是 + 下一个必须不是+ 或-
-
-(?![\+-]) 如果字符是 - 下一个必须不是+ 或-
- 前两个字符只有第二个字符前瞻,可以组合成一个串联:
[\+-](?![\+-])。
-
[^\+-] 任何不是+ 和- 的字符
但是,您必须知道regex 比regular expression 更强大。你需要正则语法而不是正则表达式:
S = +T
S = -T
S = @S
S = ε
T = @S
T = ε
这个语法是右正则的,@ 是任何不是+ 也不是- 的字符。 ε 是 epsilon = 什么都没有。
这里是确定性有限自动机(P=+M=-@=not + and not -):
/---- @ ----\
| |
| v
(S = start/final)--- P,M -->(T = final)---- P,M --->(error)
^ |
| |
\----------- @ ------------/