Regex 用于固定长度字符串的正则表达式,以多个单词开头

Regex 用于固定长度字符串的正则表达式,以多个单词开头,regex,Regex,我正在尝试制作一个正则表达式(JS风格),它匹配长度正好为17个字母数字字符的字符串,并且必须以“AB”、“DE”或“GH”开头。在这3种可能性之后,任何字母数字字符都可以接受 匹配: AB163829F13246915 DET639601BA167860 GHF1973771A002957 不匹配 XYZ63829F13246915 AAA639601BA167860 BBC1973771A002957 到目前为止,我有这个正则表达式,我正在测试 不确定为什么需要管道字符来匹配我的第一个示

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

匹配:

AB163829F13246915
DET639601BA167860
GHF1973771A002957
不匹配

XYZ63829F13246915
AAA639601BA167860
BBC1973771A002957
到目前为止,我有这个正则表达式,我正在测试

不确定为什么需要管道字符来匹配我的第一个示例,或者为什么在管道后面添加“DE”时失败

有人吗?

你几乎做到了:

(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}$

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

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

显然,这不是你的意思

试试这个:

/^(?=AB|DE|GH)[a-zA-Z0-9]{17}$/
这使用了一个前瞻性断言来确保字符串以正确的组合开始,然后在计算出17个字符时有效地重新开始

^(AB|DE|GH)[a-zA-Z0-9]{15}$
前两个字符已经占用了两个字符,因此在这之后您只需要再使用15个字母数字字符

尝试以下操作:

^(AB|DE|GH)[a-zA-Z0-9]{15}$
任何与
(AB | DE | GH)
匹配的字符都将恰好消耗两个字符,因此您需要将
[a-zA-Z0-9]
字符类上的重复更改为15

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

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

这是因为
\W
匹配除字母、数字和下划线以外的所有内容。将
\W
\ucode>放入一个求反字符类中会得到一个只匹配字母和数字的元素。

在模式中,管道会使其第一部分匹配
AB
或空字符串。您可以没有从17个字符中排除这两个字符,因此它必须匹配空字符串,以获得与模式其余部分匹配的下17个字符。模式也将匹配,例如
AB00000000000000000
,即
AB
,后跟17个字母数字

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

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

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

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


您是否试图捕获前两个单词?如果没有,您可以使用
[ABDEGH]
AB
DE
GH
部分是否也可以小写?
<xsd:restriction base="xsd:string">
        <xsd:pattern value="[a-zA-Z0-9]{1,30}" />