Regex 2位数字只允许一次(正则表达式)

Regex 2位数字只允许一次(正则表达式),regex,unix,Regex,Unix,我正在检查某个级别是否有效。 级别是形式:(但他们比这多了998个) 级别必须遵循一些规则。我编写了一个正则表达式,以符合除一条规则外的所有规则: 级别必须正好包含1乘以2和1乘以4。 (注意上面的级别有两个4和一个2。上面的级别无效。) 这是一个学校项目,请引导我找到答案。 提前谢谢 编辑: 我现在的正则表达式是: ^b{' + str(length) + r'}\n(b{1}[0-8]{' + str(length - 2) + r'}b{1}\n)+b{' + str(length) +

我正在检查某个级别是否有效。 级别是形式:(但他们比这多了998个)

级别必须遵循一些规则。我编写了一个正则表达式,以符合除一条规则外的所有规则: 级别必须正好包含1乘以2和1乘以4。 (注意上面的级别有两个4和一个2。上面的级别无效。)

这是一个学校项目,请引导我找到答案。 提前谢谢

编辑:

我现在的正则表达式是:

^b{' + str(length) + r'}\n(b{1}[0-8]{' + str(length - 2) + r'}b{1}\n)+b{' + str(length) + '}$
对于上述标高,长度=7 请注意,它甚至没有尝试过滤上面的错误级别。 其他规则包括:

  • 标高必须由“b”包围
  • 级别只能包含字符“b”和小于9的数字
  • 只能有一个2
  • 只能有一个4
  • 我上面的正则表达式确实考虑了规则1和2,但我仍然需要计算规则3和4


    我试过lookarounds之类的东西,都没办法弄明白。好吧,一个正则表达式正好代表1
    a
    就是
    [^a]*a[^a]*
    (也就是说,一个可能是空的非
    a
    ,后跟一个a,后跟一个可能是空的非
    a
    )。我将把它留给一个如何处理多行的练习&确保它涵盖整个级别


    对于1
    a
    和1
    b
    [^ab]*((a[^ab]*b)|(b[^ab]*a))[^ab]*
    ,具有相同的注意事项。说明:一系列非a或b,后跟1)a、非a或b、a或b,或2)a b、非a或b、a,后跟非a或b。

    答案是使用锚定到输入开头的负面外观

    不清楚您要匹配什么,因此我将为您当前的正则表达式使用占位符

    ^(?!.*?2.*?2)(?!.*?4.*?4)<your-regex>
    
    ^(?!*?2.*?2)(?!*?4.*?4)
    

    请参阅rhis正确拒绝超过1“2”的正则表达式。这是符合所有条件的正则表达式:

    ^b(?!(?:[^2]*2){2,})(?!(?:[^4]*4){2,})[b0-8]*b$
    
    • 它以b开头和结尾,使用
      ^b
      $b
    • 它仅由字母b和数字0-8组成,由
      [b0-8]*
    • 使用
      (?!(?:[^2]*2){2,})将不允许超过一位数字2
    • 使用
      (?!(?:[^4]*4){2,})将不允许超过一位数字4

    我正在努力理解这一点。你能解释一下这能做什么吗?我理解简单的负面表情,但这看起来相当复杂。意思是不能超过1“2”(与“4”相同)。请注意,这个正则表达式比公认答案的外观简单得多。这是因为它使用了一个不情愿的量词
    *?
    ,它将消耗尽可能少的输入来匹配-因此
    *
    不会跳过一个“2”,这会破坏意图(与贪婪的量词
    *
    ,它不起作用相反),我已经尝试并想到了这一点。但问题是,我需要对2个字符(2和4)执行此操作,这会使事情变得复杂。“BBBBBBBBBBB0000000000000B b0233333303400b B0111111110B b0000000000000b BBBBBBBBB”是一个有效的级别,但您的正则表达式无法获取它。这是不正确的。我的正则表达式抓取了他们所有人,看了现场演示:我应该提到的。我在Python中工作,这有什么区别吗?这没有任何区别,因为Python也支持lookaheads。这并不要求第一行和最后一行完全由b组成,b是。虽然没有明确说明,但似乎需要。应该很容易修复。
    ^b(?!(?:[^2]*2){2,})(?!(?:[^4]*4){2,})[b0-8]*b$