正则表达式应该处理大小写还是应该指定要在代码中匹配的大小写?

时间:2010-08-20 08:03:45

标签: regex

继续这个问题我昨天问了:

Can I shorten this regular expression?

解决方案是使用以下表达式:

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

要检查具有以下格式的字符串的匹配项:

aBcDe-fghIj-KLmno-pQRsT-uVWxy

我被建议从原始查询中省略A-Z,并使正则表达式在使用它的代码中不敏感。例如,在C#中的RegEx的构造函数中指定RegExOptions.IgnoreCase。

有没有理由在代码中而不是正则表达式本身进行此操作?

我认为这个问题足够有效,可以保证一个新问题,而不是继续昨天的讨论。

3 个答案:

答案 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)。

另见

  • regular-expressions.info/Modifiers
    • 在正则表达式中指定模式
      • 您可以/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-zRegExOptions.IgnoreCase来缩短正则表达式可能会有所帮助。

如果你问我,所有这些都是个人偏好的问题。