Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式回望(?)。最多仅在标识符后面和后面的第一个标记_C#_Regex - Fatal编程技术网

C# 正则表达式回望(?)。最多仅在标识符后面和后面的第一个标记

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,我只想返回,则以下

我有一个包含简单xml结构的字符串:

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