【问题标题】:Build regular expression构建正则表达式
【发布时间】:2021-12-04 09:04:45
【问题描述】:

我需要为其中 +/- 字符不能并排(必须由其他字符分隔)的字符串构建正则表达式。我得到了这个选项:(a*(+|-)a)*,其中a 是任何字符,* 是 Kleene 闭包,() 是为了清楚起见。但是这个表达式不能识别以下形式的行:“+”、“-”、“+ a-”等。也许有人能把我从死点上移开。我需要规律性来构建一个有限自动机。

【问题讨论】:

  • 您始终可以构建 DFA 来测试您的正则表达式。

标签: regular-language finite-automata


【解决方案1】:

可能会这样:

^(\+(?![\+-])|-(?![\+-])|[^\+-])*?$

它将所有内容限制在一行:^$。惰性量词()*? 确保不会超过一行被识别。

括号内的3个连接如下:

  • \+(?![\+-]) 如果字符 + 下一个必须+-
  • -(?![\+-]) 如果字符 - 下一个必须+-
  • 前两个字符只有第二个字符前瞻,可以组合成一个串联:[\+-](?![\+-])
  • [^\+-] 任何不是+- 的字符

但是,您必须知道regexregular 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)
      ^                          |         
      |                          |         
      \----------- @ ------------/         

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多