【问题标题】:What is the simplest regular expression for excluding a repetition pattern?排除重复模式的最简单的正则表达式是什么?
【发布时间】:2020-03-13 15:25:37
【问题描述】:

我尝试为包含000的字符串集编写正则表达式,其中字母表为{0,1}。我正在寻找运营商最少的解决方案。

我试过了:

(!+0+00)(1(!+0+00))*

Where:

  • * 是克林星

  • + 是联合运算符

  • !用于表示空字符串。

我也不确定它是否正确。

我不知道是否还有其他运算符,例如出现次数等。

【问题讨论】:

  • 如果空字符串不应该匹配 ^(1*0{1,2}(1+0{0,2})*|1+)$ regex101.com/r/LNsgnH/1 或积极的前瞻如果支持 ^(?![01]*000)[01]+$ regex101.com/r/yonYZl/1 可能会这样
  • 或者如果允许空字符串^(0{0,2}1+)*0{0,2}$regex101.com/r/NHaDTH/1
  • (!+0+00)((1+10+100)*)
  • @Thefourthbird 据我所知,我提到的那些是唯一允许的运算符。
  • 当您说最简单时,您是指最小总操作数吗?你算什么操作?形式上,我认为 Kleene 闭包 (*)、析取 (+) 和串联(并置)是可数操作,jhnc 的答案非常接近最优(但是,根据这些规则,将 1 和 1 分解的 0 可能会降低操作总数;例如 (!+0(!+0))(1(!+0(!+0)))*

标签: regex automata finite-automata nfa automata-theory


【解决方案1】:

答案很简单:

(!|0|00)(11*(!|0|00))*

因为允许有任意数量的 1,并且在这些 1 之间我们最多可以有两个 0。 至少如果我正确理解它是一种没有元素包含子字符串 000 的语言。

【讨论】:

  • 我认为您可以使用上述模式构造000 3 次(0 次 1 和 1 次 0)。除此之外,这不允许没有 0 的 1。
  • 是的,这是真的。我的意思是做11 *。我更正了答案。
猜你喜欢
  • 2020-09-07
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2019-12-22
  • 2021-02-16
  • 1970-01-01
相关资源
最近更新 更多