【问题标题】:Regular expression that matches all specified characters in any order at the start of the line在行首以任意顺序匹配所有指定字符的正则表达式
【发布时间】:2021-12-15 07:15:16
【问题描述】:

我正在寻找与开头包含“B”、“R”、“A”和“S”(以任何顺序)的任何行匹配的正则表达式。它将匹配以下所有行,除了最后两行。

BRASIL
BSRAIL
BARSILERO
BRASILERA
BRASILEÑA
BRASILEÑO
BARBADOS
BOSNIA AND HERZEGOVINA

我尝试了以下方法:

^(B|R|A|S){4}.*$
^(?=.*B)(?=.*R)(?=.*A)(?=.*S).*$
^(?=.{4})(?=.*B)(?=.*R)(?=.*A)(?=.*S).*$
^(?=.*B)(?=.*R)(?=.*A)(?=.*S){4}.*$
^(?=.*B){1}(?=.*R){1}(?=.*A){1}(?=.*S){1}.*$

【问题讨论】:

    标签: mysql regex


    【解决方案1】:

    如何使用一些 lookaheads 和限制:

    ^(?=.{0,3}B)(?=.{0,3}R)(?=.{0,3}A).{0,3}S
    

    See this demo at regex101(全匹配输出see another demo

    【讨论】:

      【解决方案2】:

      只有 24 个排列 :)

      ^(ABRS|BARS|RABS|ARBS|BRAS|RBAS|RBSA|BRSA|SRBA|RSBA|BSRA|SBRA|SARB|ASRB|RSAB|SRAB|ARSB|RASB|BASR|ABSR|SBAR|BSAR|ASBR|SABR)
      

      您可以通过将两对组合在一起来缩短它:

      ^((AB|BA)(RS|SR)|(AR|RA)(BS|SB)|(AS|SA)(BR|RB)|(BR|RB)(AS|SA)|(BS|SB)(AR|RA)|(RS|SR)(AB|BA))
      

      每个双精度对匹配 4 个输入,例如,(AB|BA)(RS|SR) 可以匹配:

      ABRS
      ABSR
      BARS
      BASR
      

      【讨论】:

        【解决方案3】:

        你可以使用

        ^([BRAS])(?!\1)([BRAS])(?!\1|\2)([BRAS])(?!\1|\2|\3)([BRAS])
        

        请参阅regex demo详情

        • ^ - 字符串开头
        • ([BRAS]) - 第 1 组:BRAS
        • (?!\1)([BRAS]) - 第 2 组:BRAS,但与第 1 组不同
        • (?!\1|\2)([BRAS]) - 第 3 组:BRAS,但与第 1 组和第 2 组不同
        • (?!\1|\2|\3)([BRAS]) - 第 4 组:BRAS,但与第 1、2 和 3 组不同。

        请注意,在 MySQL v.8 中使用该模式时,您需要将反斜杠加倍:

        "^([BRAS])(?!\\1)([BRAS])(?!\\1|\\2)([BRAS])(?!\\1|\\2|\\3)([BRAS])"
        

        【讨论】:

        • 也许会提到前瞻是 PCRE 功能; OP 没有透露他们需要哪种正则表达式方言,这违反了regex tag guidance(尽管他们的尝试表明他们尝试使用 PCRE 功能)。
        • @tripleee Lookaheads 被许多引擎支持:ECMAScript、Onigmo、.NET、Java、ICU、Python re / regex、Boost,而不仅仅是 PCRE。是的,考虑到 OP 在尝试中使用了环视,我认为前瞻是受支持的。
        • 有趣的答案。我在 MySQL 上使用它,所以它也返回“BARBADOS”。
        • @M-Coder 那是 MySQL v8 吗?您需要在 MySQL 正则表达式声明中使用双反斜杠。我将此字符串添加到答案中。注意 BARBADOS 是匹配的,因为 \1\2 等不被视为两个字符组合,而是作为八进制字符代码,因此不被解析为反向引用,而是作为字符串转义序列。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-28
        • 2017-06-12
        • 2015-08-19
        • 2013-09-27
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        相关资源
        最近更新 更多