正则表达式不包含101

时间:2016-01-17 09:09:33

标签: regex

came across不包含101的正则表达式如下:

  

0 * 1 * 0 * +(1 + 00 + 000) * +(0 < SUP> + 1 + 0 + *

我无法理解作者如何提出这个正则表达式。所以我只想到了不包含101的字符串:

  

01000100

我似乎上面的正则表达式不匹配上面的字符串。但我不确定。所以尝试转换为等效的pcre正则表达式on regex101.com,但也失败了(因为可以看出我的正则表达式甚至不匹配包含单个1的字符串。

我的翻译有什么问题?上面的正则表达式确实正确吗?如果不是正确的正则表达式?

4 个答案:

答案 0 :(得分:3)

这是一个较短的表达式^0*(1|00+)*0*$

https://www.regex101.com/r/gG3wP5/1

说明:

  • (1|00+)*只要在组中出现零,我们就可以混合使用零和
  • ^0*...0*$我们可以在前缀/后缀
  • 中拥有尽可能多的零

原始正则表达式的直接翻译就像

^(0*1*0*|(1|00|000)*|(0+1+0+)*)$

<强>更新
这似乎是上述正则表达式的人工复杂版本:

  • (1|00|000)*(1|00+)*相同
    • 它几乎是解决方案,但它与字符串001....10
    • 不匹配
  • 0*1*0*101内的字符串不匹配,但匹配0和部分01..以及..10
    • 我们仍然需要匹配01....10 01 01001..内部混合,例如..10010(0+1+0+)*
  • 10010匹配其余一些案例,但仍有一些无效的有效字符串
    • e.g。 username=raw_input("Please give me a username") def gebruikersnaam(): username(len) if len(username) >= 8: print "Well done" elif len(username) <= 1: print "More characters please" #Please try again, input your username again. 是所有情况都不匹配的最短字符串。

因此,这个解决方案过于复杂而且不完整。

答案 1 :(得分:1)

阅读regex101右侧选项卡中的说明,它告诉你你的正则表达式做什么(我认为你误解了列表运算符的作用),在列表运算符([)内,其他字符如{{ 1}}不再是元字符,因此表达式(将等同于[(0*1*0*)[1(00)(000)],这意味着它匹配[01()*[]

正则表达式0 or 1 or ( or ) or [的正确翻译  将如下:

0∗1∗0∗+(1+00+000)∗+(0+1+0+)∗

regex101

Regular expression visualization

Debuggex Demo

你的正则表达式^((?:0*1*0*)|(?:1|00|000)*|(?:0+1+0+)*)$ 做了什么:

[(0*1*0*)[1(00)(000)]*(0+1+0+)*]

[(0*1*0*)[1(00)(000)]* -> matches any of characters 0,(,),*,[ zero or more times followed by (0+1+0+)* --> matches the pattern 0+1+0+ 0 or more times followed by

所以你的表达式相当于

] --> matches the character ]这不是匹配不包含[([)01](0+1+0+)*]的字符串的正则表达式

答案 2 :(得分:0)

0 * 1 *((00 + 000)* 1 *)*(ε+ 0)

我认为这个表达涵盖了所有情况,因为 -
除1之外的任何数字都可以分成组成2和3,即任何数字n = 2 * i + 3 * j。因此,除了一个0.Hence之外,在2个连续的1之间可以有任意数量的0,因此无法获得101.

对于以一个0结尾的表达式,

ε+ 0。

答案 3 :(得分:0)

不包含101作为子字符串的语言的RE也可以写为(0*1*00)*.0*.1*.0*

这可能是我使用的较小的一个。尽量利用这一点。