我有正则表达式,匹配单词很好,除非它们包含一个特殊字符,如~Query,它是C++类成员的名称.对于单个字符的成员名称,需要使用如下所示的单词边界.
$key =~ /\b$match\b/
我试过无数表情我想会的工作,如/[~]*\b$match\b/或/\b[~]*$match\b/
是否可以在可能包含特殊字符的单词上加上单词边界?
ike*_*ami 11
\b
Run Code Online (Sandbox Code Playgroud)
是的缩写
(?:(?<!\w)(?=\w)|(?<=\w)(?!\w))
Run Code Online (Sandbox Code Playgroud)
如果要将其~视为单词字符,请更改\w为[\w~].
(?:(?<![\w~])(?=[\w~])|(?<=[\w~])(?![\w~]))
Run Code Online (Sandbox Code Playgroud)
用法示例:
my $word_char = qr/[\w~]/;
my $boundary = qr/(?<!$word_char)(?=$word_char)
|(?<=$word_char)(?!$word_char)/x;
$key =~ /$boundary$match$boundary/
Run Code Online (Sandbox Code Playgroud)
如果我们知道$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/
Run Code Online (Sandbox Code Playgroud)
这很简单,我们可以内联.
$key =~ /(?<![\w~])$match(?![\w~])/
Run Code Online (Sandbox Code Playgroud)