2012-10-03 171 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字符串不是前面或後面跟着字母數字,下劃線或撇號

相關問題