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

时间:2013-05-14 16:01:20

标签: regex

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

匹配度:

AB163829F13246915
DET639601BA167860
GHF1973771A002957

不匹配

XYZ63829F13246915
AAA639601BA167860
BBC1973771A002957

到目前为止,我正在使用http://regexpal.com/

测试这个正则表达式
^(AB|)[a-zA-Z0-9]{17}$

不确定为什么管道符号与我的第一个示例相匹配,或者为什么它在管道后添加“DE”时失败。

任何?

7 个答案:

答案 0 :(得分:15)

使用此:

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

前两个字符已经占用两个,所以在此之后你只需要再多15个字母数字字符。

http://rubular.com/r/rAWmIy4Xeh

答案 1 :(得分:4)

你差不多了:

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

Demo

由于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}" />