当需要用正则表达式判断一个字符串是否含有一个子串时,如果该子串含有一些非world字符(ASCII non-word characters,即除去[A-Za-z_0-9]
之外的字符),特别是一些在正则表达式中有特别意义的符号\ | ( ) [ ] { } ^ $ * + ? .
时,会导致匹配失败。
那么需要对要匹配的子串进行转义,既可以在正则表达式中用\Q\E,也可以在匹配前用quotemeta函数处理。
Perl中有内置的quotemeta函数,Golang中标准库regexp有QuoteMeta函数。
一个Perl的示例:
$ perl -e '$a = "a1\\/[](){}.?+*- |"; print "before: $a\n"; $a = quotemeta $a; print " after: $a\n"; '
before: a1\/[](){}.?+*- |
after: a1\\\/\[\]\(\)\{\}\.\?\+\*\-\ \|