2012-05-23 295 views
4

我想匹配包含僅限定字符的整個單詞(或字符串)。正則表達式匹配僅包含某些字符的整個單詞

例如,如果字母是dog

dog = match 
god = match 
ogd = match 
dogs = no match (because the string also has an "s" which is not defined) 
gods = no match 
doog = match 
gd = match 

在這個句子:

dog god ogd, dogs o 

...我希望以匹配doggodo(不是ogd,,因爲逗號或dogs歸因於s

回答

4

下面的正則表達式表示你正在尋找的三個字符的一次或多次出現:

[dog]+ 

說明:

中括號表示:「任何封閉的字符的」。

加號的意思是:「以前表達的一個或多個出現

這將是完全一樣的事情:

[ogd]+ 
1

根據不同的語言,這應該做你需要它做。它只會符合你上面所說的;

這個表達式:

[dog]+(?![\w,]) 
中的字符串

..

dog god ogd, dogs o 

將只匹配..

dog, god, and o 

Example in javascript

Example in php

兩個之間的任何內容[](括號)是一個字符類。它將匹配括號之間的任何字符。你也可以使用範圍.. [0-9],[a-z]等,但它只會匹配1個字符。 +*是量詞。+搜索1個或多個字符,而*搜索零個或多個字符。可以指定與大括號({})一個明確的字符範圍,把一個數字或多個數字在兩者之間:{2}將匹配僅2個字符,而{1,3}將匹配1或括號3.

任何之間()可以使用對於回調,假設您想要返回或使用字符串中作爲替換返回的值。 ?!是一個負向前視,它不會匹配後面的字符類,以確保字符所在的字符串是而不是

+0

'[\ w \ b,]'不正確。在一個字符類中,'\ b'匹配退格,而不是字邊界。爲什麼有人想要匹配一個我不知道的退格,但是一個字符類應該一次只能使用一個字符,並且字邊界'\ b'不會消耗任何東西。 –

+0

我不知道這一點。定影。 – Daedalus

9

這應該工作,你

\b[dog]+\b(?![,]) 

說明

r""" 
\b  # Assert position at a word boundary 
[dog]  # Match a single character present in the list 「dog」 
    +   # Between one and unlimited times, as many times as possible, giving back as needed (greedy) 
\b  # Assert position at a word boundary 
(?!  # Assert that it is impossible to match the regex below starting at this position (negative lookahead) 
    [,]  # Match the character 「,」 
) 
""" 
+2

你有你的錢和你的帽子顛倒了! (交換$和^) – jahroy

+0

@jahroy謝謝指出。編輯。 –

+0

你對你的錢和你的錢有你的想法......(史努比狗狗,杜松子酒和果汁) – jahroy

2

其中正則表達式的味道/工具您使用? (如JavaScript中,.NET,記事本+ +等)。如果它是一個支持先行和回顧後,你可以這樣做:

(?<!\S)[dog]+(?!\S) 

這樣一來,你就只能得到那些無論是在的開始比賽字符串或以空格開頭,或在字符串的末尾或後面跟着空格。如果你不能使用回顧後(例如,如果你正在使用JavaScript),你可以拼出領先的條件:

(?:^|\s)([dog]+)(?!\S) 

在這種情況下,你會從中檢索組#1匹配的詞。但不要採取下一步,並嘗試用(?:$|\s)替換lookahead。如果你這樣做了,第一個命中(「狗」)將消耗尾隨空間,正則表達式將無法使用它來匹配下一個單詞(「上帝」)。

相關問題