正则表达式匹配前,用quotemeta函数对字符串中的非单词字符进行转义

· Read in about 1 min · (46 Words)

当需要用正则表达式判断一个字符串是否含有一个子串时,如果该子串含有一些非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\\\/\[\]\(\)\{\}\.\?\+\*\-\ \|