C# 正则表达式回望(?)。最多仅在标识符后面和后面的第一个标记
我有一个包含简单xml结构的字符串:C# 正则表达式回望(?)。最多仅在标识符后面和后面的第一个标记,c#,regex,C#,Regex,我有一个包含简单xml结构的字符串: <folder> <id=1> <id=6> <folder> <id=2> <id=6> </folder> <folder> <id=3> <id=5> </folder> </folder> 我如何使用正则表达式只针对包含id=x的文件夹 例如,如果id=2,我只想返回,则以下
<folder>
<id=1>
<id=6>
<folder>
<id=2>
<id=6>
</folder>
<folder>
<id=3>
<id=5>
</folder>
</folder>
我如何使用正则表达式只针对包含id=x的文件夹
例如,如果id=2,我只想返回
,则以下操作应该有效:
<folder>\s*(<id=\d+>)*\s*<id=xxx>.*?</folder>
使用grep和id=2的示例:
$ grep -Pzo '(?s)<folder>\s*(<id=\d+>)*\s*<id=2>.*?</folder>' a
<folder>
<id=2>
<id=6>
</folder>
$grep-Pzo'(?s)\s*()*\s*?'a
(此处
(?s)
启用DOTALL。)解决方案
(?:(?!)*(?:(?!).|(?)|(?)*(?(开放)(?))
解释
我们从请求的标记开始:
现在有些东西不是
和
:(?:(?!))*
接下来是我们要寻找的:
然后,在结束标记:
问题是某些东西可能包含开始和结束标记。必须抓住这一点。最好的方法是使用。有了这个,我们可以匹配,直到找到结束标记*
必须是您代币的BGD:(?:(?!).|(?)|(?)*(?(打开)(?!)
对BGD的一个很好的介绍是和是的,你可能应该只使用linq到xmlYes它是C,但认为它更像是一个正则表达式问题?是的,当有疑问时,只是默认为C。如果他们不能使用正则表达式,你可以使用正则表达式,但你可能只想对xml进行反序列化,然后可以使用linq进行查找。不如搜索如何读取和操作xml,而不是确定这是一个可以用正则表达式解决的问题?提示:正则表达式对于XML来说是一个糟糕的选择。我不确定它是否适用于
id=1
,因为它应该在指定的情况下返回整个文件/内容。也许正则表达式必须找到相应的结束标记。@Verarind:我认为这不是一个要求。特别是因为不可能用正则表达式处理数量不确定的嵌套级别。在python中可能是不可能的,但.Net知道如何使您能够将相应的结束标记与打开标记相匹配。这些是“压倒”的正则表达式。传统正则表达式没有内存(或者,如果您愿意,传统正则表达式只能匹配正则语言)。然而,无论您使用的是什么regex方言,我仍然相信如果您想处理嵌套标记,使用适当的解析器将更容易、更有效。
$ grep -Pzo '(?s)<folder>\s*(<id=\d+>)*\s*<id=2>.*?</folder>' a
<folder>
<id=2>
<id=6>
</folder>