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

fle*_*her 6 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}";
Run Code Online (Sandbox Code Playgroud)

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

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

string idFormat = "[[a-zA-Z]{5}[-]{1}]{4}[a-zA-Z]{5}";
Run Code Online (Sandbox Code Playgroud)

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

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


编辑:

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

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

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

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

^([a-zA-Z]{5}-){4}[a-zA-Z]{5}$
Run Code Online (Sandbox Code Playgroud)

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

^([a-z]{5}-){4}[a-z]{5}$
Run Code Online (Sandbox Code Playgroud)

有几个答案说可以在使用az时省略AZ,但在这种情况下它似乎不起作用.

cod*_*ict 7

你可以试试:

([a-z]{5}-){4}[a-z]{5}
Run Code Online (Sandbox Code Playgroud)

并使其不区分大小写.


Dav*_*und 6

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

您的分组应该做(,)不与[,](虽然你正确使用后者指定字符集.

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

在javascript中,这样的事情:

/^([a-z]{5}-){4}[a-z]{5}$/i
Run Code Online (Sandbox Code Playgroud)

  • @fletcher:你需要*指定*正则表达式不区分大小写.你是怎么做的取决于你在做什么语言.在javascript中,它与我的例子中的`i`一样,在C#中它是`new Regex(pattern,RegexOptions.IgnoreCase);`也有案例你不能*使它不区分大小写,例如ASP.NET RegexValidator控件,它们不实现对RegexOptions的支持,可能还有一些可能根本不支持它的编程语言. (2认同)