14

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

匹配:

AB163829F13246915
DET639601BA167860
GHF1973771A002957

不匹配

XYZ63829F13246915
AAA639601BA167860
BBC1973771A002957

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

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

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

任何人?

4

7 回答 7

23

用这个:

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

前两个字符已经占了两个,因此之后您只需要再添加 15 个字母数字字符。

http://rubular.com/r/rAWmIy4Xeh

于 2013-05-14T16:04:46.297 回答
5

你几乎拥有它:

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

演示

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

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

于 2013-05-14T16:03:37.523 回答
2

你可以试试这个:

/^(?:AB|DE|GH)[A-Z0-9]{15}$/
于 2013-05-14T16:03:45.697 回答
1

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

显然,这不是你的意思。

尝试这个:

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

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

于 2013-05-14T16:04:12.673 回答
0

尝试以下操作:

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

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

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

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

这是有效的,因为\W匹配除字母、数字和下划线之外的所有内容。将\Wand_放入否定字符类中会为您提供一个仅匹配字母和数字的元素。

于 2013-05-14T16:05:41.350 回答
0

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

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

^(AB|DE|GH)[a-zA-Z0-9]{15}$
于 2013-05-14T16:06:01.900 回答
0

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

<xsd:restriction base="xsd:string">
        <xsd:pattern value="[a-zA-Z0-9]{1,30}" />
于 2018-12-07T09:36:26.200 回答