2012-10-03 126 views
6

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

我试过无数表情我想会的工作,如/[~]*\b$match\b//\b[~]*$match\b/

是否有可能把一个文字字边界可能包含特殊字符?

+1

你能准确地发布你想要的匹配吗?正则表达式是针对特定情况生成的,而不仅仅是通过假设你的字符串是什么.. –

+1

'/〜\ b $ match \ b /'应该匹配'〜Query',假设包含在'$ match'中的正则表达式将匹配'Query'。 (我刚刚测试过,'〜foo'=〜/〜\ bfoo \ b /'评估为true。) – cdhowie

+0

$匹配变量可能包含〜Query,Query或单个字母,例如p。可能是其他任何奇怪的名字开发人员使用他们的类方法。正则表达式是执行搜索的子例程的一部分。除非$ match包含〜Query,否则所有的工作都很好。 –

回答

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~])/ 
+0

谢谢,这是我想要的,虽然它很长。 $ key =〜/(?:(?<= [\ w〜])(?![\ w〜])|(?<![\ w〜])(?= [\ w〜]))$ match (?:(?<= [\ w〜])(?![\ w〜])|(?<![\ w〜])(?= [\ w〜]))/) –

+1

如果我需要包括其他特殊字符,他们会像这样添加[\ w〜'] –

+1

是。 xxxxxxxxxx – ikegami

4

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

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

这只是检查,在$match字符串不是前面或后面跟着字母数字,下划线或撇号

相关问题