C# 中的正则表达式匹配获取不包含模式的字符串组

Regex Matches in C# get groups of strings that not contains a pattern

我正在尝试从字符串中获取字符串子集的集合, 在这个例子中 <tags></tags> 给定字符串:

<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>

我假设 <tag></tag> 用作 leading/trailing 分隔符的示例。

请注意,惰性点匹配仍会匹配从第一个前导分隔符到第一次出现的尾随分隔符包括 任何前导分隔符。

要解决此问题,请使用 :

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

regex demo

由于在每个位置都执行前瞻,因此该构造相当耗费资源。您可以将其展开为

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

another regex demo

这个只允许获取文本和数字:

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