【正则表达式每日一技】逃逸正则表达式中具有特殊含义的字符

文章目录

    • 1 问题
    • 2. 解决方案
    • 3. 讨论
    • 4. 拓展
      • 逃逸块
      • 不区分大小写

1 问题

在正则表达式的场景下,一部分字符具有除字面量以外的特殊含义,有时候需要按照字符的字面量进行匹配。例如,你现在需要匹配出这一样一段文本的字面量:

The punctuation characters in the ASCII table are: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

2. 解决方案

使用下列正则表达式可以匹配出上述文本的字面量:

The punctuation characters in the ASCII table are: !"#\$%&'\(\)\*\+,-\./:;<=>\?@\[\\]\^_`\{\|}~
  • 正则表达式选项:无
  • 正则表达式风格:.NET ,Java ,JavaScript ,PCRE1 ,Perl ,Python ,Ruby

3. 讨论

在正则表达式的场景下,字符 $()*+.?[\^{| 具有特殊含义,除此之外,其他字符可以直接使用自身来匹配出字面量。这些特殊字符在正则表达式中被称为元字符。如果想要匹配其字面量,需要加上 \ 进行字符转义,因此,正则表达式 \$\(\)\*\+\.\?\[\\\^\{\| 可以匹配出文本 $()*+.?[\^{|

有些先前使用过正则表达式的读者可能会有这样的疑问:花括号和方括号一般都是成对出现,而且 - 在正则表达式中一般也有特殊含义,为什么没有在上述介绍时得到体现。这是因为 }] 以及 - 只有在特定情况下才属于正则表达式的元字符。

具体地,对于 }] ,只有当对应的 {[ 没有被转义时,二者才分别是元字符,当二者被转义时,单独出现的 }] 并没有特殊含义;同样地,对于 - ,也只有其在未被转义的 [ 之后,才是正则表达式下的元字符。

4. 拓展

逃逸块

对于支持所谓逃逸块风格的正则表达式,上述解决方案可以写成如下所示更加易读的形式:

The punctuation characters in the ASCII table are: \Q!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~\E
  • 正则表达式选项:无
  • 正则表达式风格:Java 6 ,PCRE ,Perl

在 Perl , PCRE1 以及 Java 中支持 \Q\E 形成的逃逸块,其中 \Q 可以逃逸其后直到 \E 包括 \ 在内的所有元字符,如果省略 \E 的话,那么从 \Q 直到正则表达式结尾的字符都被视为字面量。

不区分大小写

默认情况下,正则表达式是区分大小写的,即正则表达式 regex 可以匹配文本 regex 但却无法匹配出 RegexREGEXReGeX 等,如果希望其可以匹配出所有这些文本,则需要打开不区分大小写的模式。

实际上,在大多数的编程语言自带的正则表达式支持库中,都有特定的标识符可以实现这样的功能,如果你希望直接在正则表达式中实现这样的需求,那么你可以使用模式限定符 ?! ,也就是说正则表达式 (?!)regex 可以匹配出 RegexREGEXReGeX 等文本。

  • 正则表达式格式:(?!)ascii
  • 正则表达式选项:无
  • 正则表达式风格:.NET ,Java ,XRegExp ,PCRE ,Perl ,Python ,Ruby

特别地,.NET ,Java ,PCRE ,Perl 以及 Ruby 还支持局部模式限定符,即只让正则表达式的一部分在匹配时不区分大小写。例如:sensitive(?!)caseless(?-!)sensitive 可以匹配文本 sensitiveCASELESSsensitive 但不能匹配 SENSITIVEcaselessSENSITIVE ,即只有在 (?!)(?-!) 之间的正则表达式在匹配时才不区分大小写。


  1. Perl Compatible Regular Expressions ↩︎ ↩︎


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部