【问题标题】:Regular Expression Challenge: For every consecutive 6 characters, there must be two 1s (alphabet {"0", "1"})正则表达式挑战:每连续6个字符,必须有两个1(字母{“0”,“1”})
【发布时间】:2012-09-18 18:02:13
【问题描述】:

所以,我想构建一个正则表达式,我可以传入一个由 0 和 1 组成的字符串(例如“0010101000111100100011110001101100011”),然后确保对于每 6 个连续字符,其中至少需要两个 1块。

另外,长度小于 6 的字符串应该通过。

传递字符串的例子:

  • ""
  • “00”
  • “11000011”
  • “01010100”

失败字符串示例:

  • “110000000011”
  • “000001”

这些示例是非常小的字符串,但我想构建一个以获取任意长度的字符串。

现在,我正在寻找一种用正则表达式表达这一点的好方法,而不是使用循环等解决方案。

【问题讨论】:

    标签: regex


    【解决方案1】:

    只需使用此正则表达式并检查它是否匹配:

    /000000|000001|000010|000100|001000|010000|100000/
    

    【讨论】:

    • 001001 怎么样?或010010?或010101?
    • @Chris,这些例子中有 2 个 1,所以应该没问题。
    • 但不是两个连续的 1,这是规定的要求
    • 我没有在要求中找到这个:'对于每6个连续字符,该块中至少需要有两个1'
    【解决方案2】:

    这是一个应该可以解决问题的正则表达式(匹配有效字符串):

    ^((?!0{6}|10{5}|010{4}|001000|000100|0{4}10|0{5}1)[01])+$
    

    示例:http://www.rubular.com/r/VelZ1Iqml6

    这在重复中使用负前瞻,以便在字符串中的每个位置检查条件。

    如果您能够只检查不匹配的字符串,那就更简单了,您可以使用 davidrac 的解决方案或这个稍微缩短的版本(我在正则表达式的前瞻中使用):

    0{6}|10{5}|010{4}|001000|000100|0{4}10|0{5}1
    

    【讨论】:

    • 您的正则表达式接受不符合要求的 10001000
    • @MichalKlouda - 我编辑了我的原始答案,它不再接受。
    • 好主意,但仍然......更新后的不接受有效的 1000010
    • @MichalKlouda - 不,不是,该字符串的尾端是“000010”。
    • 是的,抱歉...我的眼睛很累;)为此 +1
    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多