正则表达式匹配从特殊字符开始的单词边界

时间:2012-10-03 16:25:51

标签: regex perl

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

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

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

2 个答案:

答案 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中的字符串是不是在字母数字,下划线或波浪线之前或之后