2011-06-09 36 views
1

關於這一點,我怎麼能在C#Regex上啓用dotall標誌? 而我有這個正則表達式。C#|正則表達式Dotall和結果匹配

string reg = "<table>.*</table>"; 

再舉例來說,我regexed這個HTML文本

<table id="table1"> 
<table id="table2"> 
</table> 
</table> 

哪裏我正則表達式中止比賽?第一</table>或第二</table>

謝謝你們.. :)

+3

第100次。不要在XML/HTML〜上使用REGEX! – leppie 2011-06-09 09:11:40

+0

一個更有趣的例子是你的正則表達式匹配從第一個「

」到最後一個「
」(這樣它就會從第一個「」到最後一個「
」在輸入的情況下**將不匹配** - 你有屬性)。另外,如果你有兩個問題,請提出兩個問題':)' – Kobi 2011-06-09 09:14:25

+0

@leppie,XPATH是不夠準確的.. – 2011-06-09 09:18:53

回答

3

正則表達式是由默認的貪婪,吞噬儘可能多地。因此,它會停在第二張桌子上。

您可以通過應用問號修飾符來更改此設置。

<table>.*?</table> 

這就是說,你需要確保你的正則表達式是建立覆蓋多行文字

+0

如果我有這個'

'?它會停留在最後還是第二?或者第一個? – 2011-06-09 09:12:34

+0

使用'。*?'時,它會匹配'

',因此找到的第一個''將結束匹配。不要使用這個正則表達式,你想要一個適當的解析器... – Qtax 2011-06-09 09:28:27

+0

必須同意Qtax。正則表達式不是解析標記的正確解決方案。你已經用你自己的例子證明了這一點。 – 2011-06-09 09:34:21

2

*是「貪婪的」操作員 - 即它吃掉儘可能,所以它會在第一<table>和第二</table>之間匹配(提供正則表達式被配置成多行匹配結束)。您可以通過使用*?來代替它,使其變得「非貪婪」。

+0

怎麼樣,如果我有這個'

'?它會停在第三還是第二?或者第一個? – 2011-06-09 09:17:07

0

DOTALL是regexflag所以你可以使用這樣的: Regex.Replace(輸入,正則表達式,替換,RegexOptions.Singleline | RegexOptions.IgnoreCase)

DOTALL = RegexOptions.Singleline,因爲它處理字符串作爲單線。

,你還可以修改正則表達式標誌的正則表達式指令的中間,像: - 匹配具有以下有效的標誌圖案的剩餘部分(S):米格(多行,忽略大小寫,全局和單線)