我正在尝试制作一个正则字符串(JS风格),该字符串长度恰好为17个字母数字字符,并且必须以“AB”,“DE”或“GH”开头。在这3种可能性之后,任何字母数字字符被接受。
匹配度:
AB163829F13246915
DET639601BA167860
GHF1973771A002957
不匹配
XYZ63829F13246915
AAA639601BA167860
BBC1973771A002957
到目前为止,我正在使用http://regexpal.com/
测试这个正则表达式^(AB|)[a-zA-Z0-9]{17}$
不确定为什么管道符号与我的第一个示例相匹配,或者为什么它在管道后添加“DE”时失败。
任何?
答案 0 :(得分:15)
答案 1 :(得分:4)
你差不多了:
(AB|DE|GH)[a-zA-Z0-9]{15}
由于AB|DE|GH
已经是2-char长,因此只允许超过15个。
如果需要,您还可以使用非捕获组((?:AB|DE|GH)[a-zA-Z0-9]{15}
)并锚定您的模式(^(?:AB|DE|GH)[a-zA-Z0-9]{15}$
)。
答案 2 :(得分:2)
你可以试试这个:
/^(?:AB|DE|GH)[A-Z0-9]{15}$/
答案 3 :(得分:1)
您当前的正则表达式正在查找可能以AB
开头的字符串,后跟一些字母数字字符。如果它以AB
开头,则字符串长度为19.否则,它为17。
显然,这不是你的意思。
试试这个:
/^(?=AB|DE|GH)[a-zA-Z0-9]{17}$/
这使用前瞻断言来确保字符串以正确的组合开始,然后在计算出17个字符时有效地重新开始。
答案 4 :(得分:0)
尝试以下方法:
^(AB|DE|GH)[a-zA-Z0-9]{15}$
(AB|DE|GH)
匹配的内容将只消耗两个字符,因此您需要将[a-zA-Z0-9]
字符类的重复更改为15。
请注意,这也可以缩短一点:
^(AB|DE|GH)[^\W_]{15}$
这是有效的,因为\W
匹配除字母,数字和下划线之外的所有内容。将\W
和_
放在一个否定的字符类中会为您提供一个只匹配字母和数字的元素。
答案 5 :(得分:0)
在您的模式中,管道使其第一部分与AB
或空字符串匹配。您没有排除17中的两个字符,因此必须匹配空字符串以获得接下来的17个字符以匹配模式的其余部分。该模式也将匹配例如AB00000000000000000
,即AB
,后跟17个字母数字。
你应该让它与开头两个字符的组合相匹配,然后是15个字母数字字符:
^(AB|DE|GH)[a-zA-Z0-9]{15}$
答案 6 :(得分:0)
对于固定长度的字母单义字符串,您可以在xsd中添加以下限制。
<xsd:restriction base="xsd:string">
<xsd:pattern value="[a-zA-Z0-9]{1,30}" />