我有正則表達式匹配單詞,除非它們包含特殊字符,如 〜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,否則所有的工作都很好。 –