正则表达式匹配在C#中获取不包含

问题描述:

我想在给定的字符串<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块忽略没有关闭块 –

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

请注意,延迟点匹配仍将匹配从第一个前导分隔符到尾部分隔符的第一个匹配项,包括任何出现的前导分隔符。

要解决它,使用tempered greedy token

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

regex demo

由于先行在每个位置执行,这个结构相当消耗资源。您可以将其展开为

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

请参阅another regex demo

+0

这是伟大的,但我的票。 – nicael

+0

它看起来不错,它的工作原理。尽管我不能完全理解语法。猜我有一些阅读:) –

+0

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

这一个许可证,得到的只有文本和数字:

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