7

我的正则表达式可以很好地匹配单词,除非它们包含特殊字符,例如 ~Query,它是 C++ 类成员的名称。对于单个字符的成员名称,需要使用如下所示的单词边界。 $key =~ /\b$match\b/

我尝试了许多我认为会起作用的表达方式,例如/[~]*\b$match\b//\b[~]*$match\b/

是否可以在可能包含特殊字符的单词上设置单词边界?

4

2 回答 2

13
\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~])/
于 2012-10-03T16:31:23.133 回答
4

假设您不需要检查的内容$match(即它总是包含一个有效的标识符),您可以这样写

$key =~ /(?<![~\w])$match(?![~\w])/

它只是检查字符串 in$match前面或后面没有字母数字、下划线或波浪号

于 2012-10-03T17:14:10.977 回答