【正则表达式每日一技】逃逸正则表达式中具有特殊含义的字符
文章目录
- 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 但却无法匹配出 Regex ,REGEX 或 ReGeX 等,如果希望其可以匹配出所有这些文本,则需要打开不区分大小写的模式。
实际上,在大多数的编程语言自带的正则表达式支持库中,都有特定的标识符可以实现这样的功能,如果你希望直接在正则表达式中实现这样的需求,那么你可以使用模式限定符 ?! ,也就是说正则表达式 (?!)regex 可以匹配出 Regex ,REGEX 或 ReGeX 等文本。
- 正则表达式格式:
(?!)ascii- 正则表达式选项:无
- 正则表达式风格:.NET ,Java ,XRegExp ,PCRE ,Perl ,Python ,Ruby
特别地,.NET ,Java ,PCRE ,Perl 以及 Ruby 还支持局部模式限定符,即只让正则表达式的一部分在匹配时不区分大小写。例如:sensitive(?!)caseless(?-!)sensitive 可以匹配文本 sensitiveCASELESSsensitive 但不能匹配 SENSITIVEcaselessSENSITIVE ,即只有在 (?!) 和 (?-!) 之间的正则表达式在匹配时才不区分大小写。
Perl Compatible Regular Expressions ↩︎ ↩︎
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
