我可以缩短这个正则表达式吗?

时间:2010-08-19 07:13:23

标签: regex

我需要检查字符串是否符合特定的ID格式。

ID的格式如下:

aBcDe-fghIj-KLmno-pQRsT-uVWxy

由五个字母大写或小写的五个块的序列,由一个短划线分开。

我有以下正则表达式:

string idFormat = "[a-zA-Z]{5}[-]{1}[a-zA-Z]{5}[-]{1}[a-zA-Z]{5}[-]{1}[a-zA-Z]{5}[-]{1}[a-zA-Z]{5}";

请注意,没有尾随短划线,但ID中的所有块都遵循相同的格式。因此,我希望能够在正则表达式中用尾随破折号表示这四个块的序列,并避免重复。

我尝试了以下操作,但它不起作用:

string idFormat = "[[a-zA-Z]{5}[-]{1}]{4}[a-zA-Z]{5}";

如何缩短此正则表达式并删除重复的部分?

确保每个块也不包含任何数字的最佳方法是什么?


编辑:

感谢您的回复,我现在理解正则表达式中的分组。

我正在针对正则表达式运行一些测试,以下是相关的:

测试1:aBcDe-fghIj-KLmno-pQRsT-uVWxy
测试2:abcde-fghij-klmno-pqrst-uvwxy

使用以下正则表达式,两个测试都通过:

^([a-zA-Z]{5}-){4}[a-zA-Z]{5}$

使用下一个正则表达式,测试1失败:

^([a-z]{5}-){4}[a-z]{5}$

有几个答案说可以在使用a-z时省略A-Z,但在这种情况下它似乎没有用。

5 个答案:

答案 0 :(得分:7)

您可以尝试:

([a-z]{5}-){4}[a-z]{5}

并使其不区分大小写。

答案 1 :(得分:6)

如果您可以将regex选项设置为不区分大小写,则可以使用普通[a-zA-Z]替换所有[a-z]。此外,[-]{1}可以写为-

您的分组应该使用(),而不是[](虽然您在指定字符集时正确使用后者。

根据上下文,您可能希望分别输入匹配字符串开头和结尾的^...$,以验证整个字符串是否匹配(即没有额外的字符)。

在javascript中,类似这样:

/^([a-z]{5}-){4}[a-z]{5}$/i

答案 2 :(得分:1)

这对我有用,但您可能需要查看它:

[a-zA-Z]{5}(-[a-zA-Z]{5}){4}

(一组五个字母,然后是[破折号+五个字母组]四次)

答案 3 :(得分:0)

尝试

string idFormat = "([a-zA-Z]{5}[-]{1}){4}[a-zA-Z]{5}";

即。你基本上用圆括号替换你的括号。括号不是用于分组,而是用于定义一类可接受的字符。

但是,请注意,对于缩短版本,可以使用表达式验证字符串而不是来分析它。如果要处理5组字符,则需要将它们分为5组:

string idFormat =
    "([a-zA-Z]{5})-([a-zA-Z]{5})-([a-zA-Z]{5})-([a-zA-Z]{5})-([a-zA-Z]{5})";

所以你可以解决每个小组并处理它。

答案 4 :(得分:0)

([a-zA-Z]{5}[-]{1}){4}[a-zA-Z]{5}