REGEX中继器“或”运营商

时间:2014-01-28 19:27:01

标签: regex

我希望将正则表达式与 2 [0-9]重复(然后是其他一些模式)进行匹配

[0-9]{2}[A-z]{4}

OR 6 [0-9]重复(然后是其他一些模式)

[0-9]{6}[A-z]{4}

以下内容太过包容:

[0-9]{2,6}[A-z]{4}

问题

有没有办法可以指定2次或6次重复?

4 个答案:

答案 0 :(得分:5)

您可以在非捕获组中使用或|这样:

(?:[0-9]{2}|[0-9]{6})[A-z]{4}

请注意,使用[A-z]不仅包括大写和小写字母,还包括[\]^,{ {1}}和_位于ASCII代码点中的'Z之间。正如@AlanMoore在评论中指出的那样,使用a作为信件。

答案 1 :(得分:3)

这应该有效

(?:[0-9]{2}|[0-9]{6})[a-zA-Z]{4}

您是否有一些我可以验证的测试用例。

  • 12asdf - 传递
  • 123456asdf - 传递
  • 1234asdf - 失败

但是,如果您没有将正则表达式的开头锚定到单词(\ b)或行边界(^),则1234asdf34asdf作为部分匹配。

所以要么

\b(?:[0-9]{2}|[0-9]{6})[a-zA-Z]{4}

^(?:[0-9]{2}|[0-9]{6})[a-zA-Z]{4}

作为正则表达式更改的快速概述

  • (?: )创建非捕获组
  • |在替代品之间进行选择[0-9] {2}和[0-9] {6}
  • ^匹配行的开头
  • $匹配行尾
  • \b匹配字边界
  • 正在使用
  • [a-zA-Z]代替[A-z]因为它可能是预期的(所有字母字符,无论情况如何)

您还可以将[0-9]替换为\d,这是任何数字的简写。我能想到的最好的方法,而不是部分匹配如下

(?:\b|^)(?:\d{2}|\d{6})[a-zA-Z]{4}(?:\b|$)

答案 2 :(得分:3)

经典的方式是:

(?:[0-9]{2}|[0-9]{6})[A-z]{4}

[字面意思为[0-9]{2}[0-9]{6}]

但你也可以使用这个,这应该比上面的更有效,潜在的回溯更少:

[0-9]{2}(?:[0-9]{4})?[A-z]{4}

[此处,[0-9]{2}然后潜在的其他4 [0-9],在所需条件下总共有6 [0-9]


你可能不知道[A-z]匹配字母和其他一些字符,但实际上确实如此。

范围[A-z]实际上相当于:

[A-Z\[\\\]^_`a-z]

请注意,匹配的其他字符为:

[ \ ] ^ _ `

[空间包括自愿进行分离但不属于角色的部分]

这是因为这些字符位于unicode表中的块字母和小写字母之间。

答案 3 :(得分:2)

不明显,但是是的:

(?:\d{2}|\d{6})