继续这个问题我昨天问了:
Can I shorten this regular expression?
解决方案是使用以下表达式:
^([a-z]{5}-){4}[a-z]{5}$
要检查具有以下格式的字符串的匹配项:
aBcDe-fghIj-KLmno-pQRsT-uVWxy
我被建议从原始查询中省略A-Z,并使正则表达式在使用它的代码中不敏感。例如,在C#中的RegEx的构造函数中指定RegExOptions.IgnoreCase。
有没有理由在代码中而不是正则表达式本身进行此操作?
我认为这个问题足够有效,可以保证一个新问题,而不是继续昨天的讨论。
答案 0 :(得分:2)
这个问题没有绝对正确的答案。有几种方法可以实现某些事情,哪种方式最好有时候是主观的。此外,这两种方式并不完全相同。
应该注意,正则表达式模式实际上可以部分区分大小写。也就是说,您可以在一个部分中使用不区分大小写的模式,但在其他部分中区分大小写。
也许一个好的指导方针如下:
请注意,这两种模式实际上存在很大差异:
/([a-z]+)-\1/i
/([A-Za-z]+)-\1/
这两种模式都匹配"FOO-FOO"
和"bar-bar"
,但第一种模式与"BOO-boo"
(as seen on rubular.com)匹配。第二种模式不是(as seen on rubular.com)。
/regex/i
Pattern.CASE_INSENSITIVE
(Java中为/(?i)regex/
)
/first(?i)second(?-i)third/
/first(?i:second)third/
答案 1 :(得分:1)
有没有理由在代码中而不是正则表达式本身进行此操作?
我可以想到你需要匹配包括case的情况,所以你想要正则表达式本身的控件。我还可以想到能够以小写形式编写然后将引擎设置为不区分大小写的情况将使表达式更易于编写和维护。封闭平台和语言/工具可能会影响偏好。
总结:对于每个使用正则表达式的情况,都有理由偏好一种方式而不是另一种方式,但总的来说没有压倒一切的方法。
答案 2 :(得分:0)
我猜,除了可读性之外,没有真正的理由。在您的情况下,如果您提供额外的两个A-Z
而不是使用RegExOptions.IgnoreCase
,IMO并不重要。但是如果你在正则表达式中使用了很多a-zA-Z
,那么使用a-z
和RegExOptions.IgnoreCase
来缩短正则表达式可能会有所帮助。
如果你问我,所有这些都是个人偏好的问题。