我有匹配单词的正则表达式,除非它们包含特殊字符,例如
〜查询哪个是C ++类成员的名称。
对于单个字符的成员名称,需要使用如下所示的单词边界。
$key =~ /\b$match\b/
我尝试了许多我认为可行的表达方式,例如/[~]*\b$match\b/
或/\b[~]*$match\b/
是否可以在可能包含特殊字符的单词上添加单词边界?
答案 0 :(得分:10)
\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
只能匹配以$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~])/
答案 1 :(得分:4)
假设您不需要检查$match
的内容(即它始终包含有效的标识符),您可以写这个
$key =~ /(?<![~\w])$match(?![~\w])/
只是检查$match
中的字符串是不是在字母数字,下划线或波浪线之前或之后