我有正则表达式匹配单词,除非它们包含特殊字符,如 〜Query是C++类的成员的名称。 需要为单个字符的成员名称使用如下所示的字边界。 $key =~ /\b$match\b/
正则表达式匹配以特殊字符开头的单词边界
我试过无数表情我想会的工作,如/[~]*\b$match\b/
或/\b[~]*$match\b/
是否有可能把一个文字字边界可能包含特殊字符?
我有正则表达式匹配单词,除非它们包含特殊字符,如 〜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
只能匹配的东西,开始和以$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~])/
谢谢,这是我想要的,虽然它很长。 $ key =〜/(?:(?<= [\ w〜])(?![\ w〜])|(?<![\ w〜])(?= [\ w〜]))$ match (?:(?<= [\ w〜])(?![\ w〜])|(?<![\ w〜])(?= [\ w〜]))/) –
如果我需要包括其他特殊字符,他们会像这样添加[\ w〜'] –
是。 xxxxxxxxxx – ikegami
假设你没有需要检查的$match
内容(即它总是包含一个有效的标识符),你可以这样写
$key =~ /(?<![~\w])$match(?![~\w])/
这只是检查,在$match
字符串不是前面或后面跟着字母数字,下划线或撇号
你能准确地发布你想要的匹配吗?正则表达式是针对特定情况生成的,而不仅仅是通过假设你的字符串是什么.. –
'/〜\ b $ match \ b /'应该匹配'〜Query',假设包含在'$ match'中的正则表达式将匹配'Query'。 (我刚刚测试过,'〜foo'=〜/〜\ bfoo \ b /'评估为true。) – cdhowie
$匹配变量可能包含〜Query,Query或单个字母,例如p。可能是其他任何奇怪的名字开发人员使用他们的类方法。正则表达式是执行搜索的子例程的一部分。除非$ match包含〜Query,否则所有的工作都很好。 –