2010-01-05 24 views
4

多線路測試字符串:匹配每一個引用的字符串不包含一個子

dkdkdkdk dkdkdkdk dkdkdkd dkdkdkd "hello" dkdkdkdkdk dkdkdk "goodbye.hello" dkdkdkd kdkdkd kdkdkdk "hello.goodbye.hello" dddd "test" ssss "http:x-y.f/z/z" "" "." 
"http:/dkdkd/dkdkdk/dkdkdkdkdkdk.g" 

我想包含每一個引號的字符串匹配「hello

這每一個引號的字符串匹配

\"(.+?)\" 

這匹配每個包含hello的引用字符串

\"(.*?)hello(.*?)\" 

但是,這不每個引號的字符串不包含

\"(.*?)(?!hello)(.*?)\" 

任何幫助的感謝匹配你好!

回答

3

我的初步答案是,需要在每個點匹配時應用排除模式,就像這樣:

\"((?!hello).)*?\" 

但是存在這樣包含多個引用字符串的目標與此正則表達式的一個問題 - - 一個字符串的結束引號與另一個引號的開始字符串之間的空格也是該表達式的「引號字符串」。

因此,我的建議是使用簡單的"[^"]*"模式從您的目標中提取所有帶引號的字符串,然後評估您要禁止的單詞的每個匹配項。

+0

更好地利用' 「[^」] * 「',而不是'」。*?「'。 – Gumbo 2010-01-05 23:10:43

+0

@Gumbo我不認爲這能起到什麼作用? – 2010-01-05 23:14:27

+1

@Daniel Vandersluis :它避免了不必要的回溯 – Gumbo 2010-01-05 23:19:03

0

試試這個

\"((?!hello).)*?\" 
+1

這就是我最初想到的,但我刪除了我的答案,因爲它有問題;在測試字符串中它不會匹配'「hello」',而是它會匹配'「dkdkdkdkdk dkdkdk」' – 2010-01-05 23:06:39

+0

@Vandersluis,在這裏相同 – 2010-01-05 23:08:31

+0

更好地使用'「[^」] *「'而不是'」。*?「'。 – Gumbo 2010-01-05 23:11:13

相關問題