我的正则表达式可以很好地匹配单词,除非它们包含特殊字符,例如 ~Query,它是 C++ 类成员的名称。对于单个字符的成员名称,需要使用如下所示的单词边界。
$key =~ /\b$match\b/
我尝试了许多我认为会起作用的表达方式,例如/[~]*\b$match\b/
或/\b[~]*$match\b/
是否可以在可能包含特殊字符的单词上设置单词边界?
\b
简称
(?:(?<!\w)(?=\w)|(?<=\w)(?!\w))
如果要~
作为单词字符处理,请更改\w
为[\w~]
.
(?:(?<![\w~])(?=[\w~])|(?<=[\w~])(?![\w~]))
示例用法:
my $word_char = qr/[\w~]/;
my $boundary = qr/(?<!$word_char)(?=$word_char)
|(?<=$word_char)(?!$word_char)/x;
$key =~ /$boundary$match$boundary/
如果我们知道$match
只能匹配以 a 开头和结尾的东西$word_char
,我们可以简化如下:
my $word_char = qr/[\w~]/;
my $start_bound = qr/(?<!$word_char)/;
my $end_bound = qr/(?!$word_char)/;
$key =~ /$start_bound$match$end_bound/
这很简单,我们可以内联。
$key =~ /(?<![\w~])$match(?![\w~])/
假设您不需要检查的内容$match
(即它总是包含一个有效的标识符),您可以这样写
$key =~ /(?<![~\w])$match(?![~\w])/
它只是检查字符串 in$match
前面或后面没有字母数字、下划线或波浪号