2015-08-23 17 views
0

在C#,我有以下正則表達式模式(在HTML字符串):正則表達式 - 模式發現的自身份與(+)

Regex TR = new Regex(@"<tr class=""(\w+)"" rel=""(\w+)"">(.+)</tr>"); 

的問題是,當我運行它,則匹配包括所有內容,直到HTML代碼中發生的最後一個</tr>。代碼中有許多<tr>標記,因此(.+)模式包含它們並僅在最後一次出現</tr>時停止。

我試過用(\w+)來代替,但是它並沒有在標籤內部得到某些字符。

那麼我怎樣才能使這種模式停在第一個</tr>,而不是直到代碼中的最後一個?

+1

關於這個主題的閱讀:[RegEx match open tags but XHTML self-contained tags](http://stackoverflow.com/a/1732454/335858) – dasblinkenlight

+1

'。+?'.........順便說一句:使用https://htmlagilitypack.codeplex.com/而不是正則表達式 – Eser

+0

嘗試'。*?'而不是'。+'。 – Xufox

回答

0

下面的正則表達式將停在第一</tr>標籤:

<tr(\s+)class(\s*)=(\s*)"[^"]*"(\s+)rel(\s*)=(\s*)"[^"]*"(\s*)>(.(?!<\/tr>))*[\s\S]<\/tr> 

你可以改變你的代碼如下得到你想要的東西:

Regex TR = new Regex(@"<tr class=""(\w+)"" rel=""(\w+)"">(.(?!<\/tr>))*[\s\S]</tr>"); 

(?!ABC)被稱爲負先行 。它指定了一個在主表達式之後不匹配的組(如果匹配,結果將被丟棄)。

供將來參考:嘗試使用RegExr創建並測試您的正則表達式模式。

-1
> So how can I make this pattern stop at the first </tr> 

最有效的捕獲過程範例是不盲目消費,但消費已知。

由於要抓取的文本屬於><的錨點,爲什麼不使用結束錨點的邏輯<爲正則表達式語法分析器提供提示?

通過使用^字符(它是在一組)在一組[ ]我們有效地告訴解析器消耗,直到字符(S)的一組特定的被擊中。

在你的情況變化

>(.+)</tr> 

[^<]+它說消耗一切直到(或除外)時,<角色被擊中,一次或多次:

>([^<]+)</tr> 

使用的[^ ]集是一個強大的,我在90%的正則表達式模式中使用,而不是致盲消耗與.+或更多方面影響傾向.*


還要使你的模式更容易處理代替"這樣你就不會用正則表達式解析器之前,C#語法分析器戰鬥使用\x22