2011-02-23 39 views
2

我想捕捉任何內容,但不包括特定的模式。我的實際問題與解析HTML中的信息有關,但我將這個問題歸結爲一個例子,希望能夠澄清我的問題。正則表達式 - 模式捕捉除了模式[.net]以外的所有內容

來源

xaxbxcabcabc 

所需的匹配

xaxbxc 

如果我使用一個超前的表達將捕獲第一次出現

.*(?=abc) => xaxbxcabc 

我想SOMET沿着一個否定的角色類別的行,只是爲了一種否定的模式。

.*[^abc] //where abc as a pattern instead of a list giving anything but a, b or c 

我使用http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx測試

+2

[正則表達式是不解析HTML(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self -contained標籤/ 17324 54#1732454) – 2011-02-23 19:35:58

+1

你可能會發現http://regexhero.net/tester/也是一個很好的測試者。 – driis 2011-02-23 19:37:09

+0

@ Mormegil使用'*?'的答案就是你想要的。只是供參考,它可能有一個負面的前瞻,所以你最後的代碼塊將變成'。*(?!abc)'。然而,這與你的情況似乎並不相關,也不是負面的後顧之憂。 '。*(?!abc)'會從您的示例中捕獲'xaxbxcabcabc','。*(?<!abc)'會捕獲'xaxbxcabcab'。 – 2011-02-23 20:10:24

回答

3

如果錨定的正則表達式,你會解決問題(+使用懶惰量詞的):

"^.*?(?=abc)" 
+0

感謝您的回覆。這是我決定採取的解決方案。 – Hypnovirus 2011-02-23 21:02:52

2

爲什麼不使用replace

string result = new Regex("abc.*$").Replace (input, ""); 

這將開始刪除一切從第一個匹配的短語,讓你所有的內容,直到那一點。

+0

感謝您的回答。對於我使用的例子,這不僅可以工作,而且可能是最乾淨的解決方案。但是,在我正在處理的情況下,它會添加一個步驟。我正在使用lookbehind來啓動模式。所以,我必須在看起來後面匹配所有內容,然後在該匹配上進行替換。 – Hypnovirus 2011-02-23 20:36:07

4

非貪婪(懶惰)量詞*?在這裏可能很有用,例如,

^(?<captured>.*?)abc.*$ 

編輯:只要是明確的,明確的捕捉是沒有必要的(當然),真正重要的部分只是

(.*?)abc 
+0

感謝您的回覆。我希望我可以選擇多個接受的答案。 – Hypnovirus 2011-02-23 21:03:46