【问题标题】:Regex for fixed length string, starting with multiple words固定长度字符串的正则表达式,以多个单词开头
【发布时间】:2025-12-29 11:10:12
【问题描述】:

我正在尝试制作一个匹配长度正好为 17 个字母数字字符且必须以“AB”、“DE”或“GH”开头的字符串的正则表达式(JS 风格)。在这 3 种可能性之后,任何字母数字字符被接受。

匹配:

AB163829F13246915
DET639601BA167860
GHF1973771A002957

不匹配

XYZ63829F13246915
AAA639601BA167860
BBC1973771A002957

到目前为止,我有这个正则表达式,我正在 http://regexpal.com/ 上进行测试

^(AB|)[a-zA-Z0-9]{17}$

不知道为什么需要管道字符才能匹配我的第一个示例,或者为什么在管道后添加“DE”时它会失败。

有人吗?

【问题讨论】:

  • 你想捕捉前两个词吗?如果没有,您可以使用[ABDEGH]
  • ABDEGH 部分也可以小写吗?

标签: regex


【解决方案1】:

使用这个:

^(AB|DE|GH)[a-zA-Z0-9]{15}$

前两个字符已经占了两个,所以你只需要再增加 15 个字母数字字符。

http://rubular.com/r/rAWmIy4Xeh

【讨论】:

    【解决方案2】:

    你已经差不多了:

    (AB|DE|GH)[a-zA-Z0-9]{15}
    

    Demo

    由于AB|DE|GH 已经是 2 个字符长,因此只能允许超过 15 个字符。

    如果需要,您还可以使用非捕获组 ((?:AB|DE|GH)[a-zA-Z0-9]{15}) 并锚定您的模式 (^(?:AB|DE|GH)[a-zA-Z0-9]{15}$)。

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      /^(?:AB|DE|GH)[A-Z0-9]{15}$/
      

      【讨论】:

        【解决方案4】:

        您当前的正则表达式正在寻找一个字符串,该字符串可能以AB 开头,也可能不以AB 开头,后跟一些字母数字字符。如果它确实以AB 开头,则字符串长度将为19。否则为17。

        显然,这不是你的意思。

        试试这个:

        /^(?=AB|DE|GH)[a-zA-Z0-9]{17}$/
        

        这使用前瞻断言来确保字符串以正确的组合开头,然后在计算完 17 个字符时有效地重新开始。

        【讨论】:

          【解决方案5】:

          尝试以下方法:

          ^(AB|DE|GH)[a-zA-Z0-9]{15}$
          

          (AB|DE|GH) 匹配的任何内容都将消耗两个字符,因此您需要将 [a-zA-Z0-9] 字符类的重复次数更改为 15。

          请注意,这也可以缩短一点:

          ^(AB|DE|GH)[^\W_]{15}$
          

          这是因为\W 匹配除字母、数字和下划线之外的所有内容。将\W_ 放在一个否定字符类中会给你一个只匹配字母和数字的元素。

          【讨论】:

            【解决方案6】:

            在您的模式中,管道使其第一部分匹配AB 或空字符串。您尚未从 17 个字符中排除这两个字符,因此它必须匹配空字符串才能使接下来的 17 个字符与模式的其余部分匹配。该模式还将匹配例如 AB00000000000000000,即 AB 后跟 17 个字母数字。

            你应该让它匹配开头的两个字符的组合,然后是 15 个字母数字字符:

            ^(AB|DE|GH)[a-zA-Z0-9]{15}$
            

            【讨论】:

              【解决方案7】:

              您可以在 xsd 中为固定长度的字母字符串添加以下限制。

              <xsd:restriction base="xsd:string">
                      <xsd:pattern value="[a-zA-Z0-9]{1,30}" />
              

              【讨论】:

                最近更新 更多