2016-07-27 192 views
3

我想在給定的字符串<tags></tags> 這個例子對來自一個字符串, 得到串子集的集合的模式串組:正則表達式匹配在C#中獲取不包含

<tag>abc</tag><tag>123</tag> 

我想2組: <tag>abc</tag><tag>123</tag>

這很容易爲<tag>.*?</tag>模式。

Example

但我想它更精確。

給出字符串:

<tag>abc</tag><tag><tag>123</tag> 

我會把它省略中間的第二<tag>(因爲我在尋找開放和關閉標籤)。

我想這樣的結果:

<tag>abc</tag> 
<tag>123</tag> 

我試圖創建一個超前或反向預搜索,但沒有運氣(我敢肯定,我使用它錯了):

<tag>.*?(?<!<tag>)</tag> 
+0

是標籤一些佔位?還是你想解析一些XML/HTML? –

+1

@WiktorStribiżew是的,它是一個佔位符,我想只得到有效的html塊忽略沒有關閉塊 –

回答

4

我假定<tag></tag>被用作前導/尾隨分隔符的示例。

請注意,延遲點匹配仍將匹配從第一個前導分隔符到尾部分隔符的第一個匹配項,包括任何出現的前導分隔符。

要解決它,使用tempered greedy token

<tag>(?:(?!</?tag>).)*</tag> 

regex demo

由於先行在每個位置執行,這個結構相當消耗資源。您可以將其展開爲

<tag>[^<]*(?:<(?!/?tag>)[^<]*)*</tag> 

請參閱another regex demo

+0

這是偉大的,但我的票。 – nicael

+0

它看起來不錯,它的工作原理。儘管我不能完全理解語法。猜我有一些閱讀:) –

+0

@ Sag1v:我提供的鏈接包含所有必要的信息。這是它:http://stackoverflow.com/a/37343088/3832970 –

0

這一個許可證,得到的只有文本和數字:

<tag>(.[a-zA-Z\d]*)</tag>