使用多行无法使正则表达式正常工作

Bir*_*iri 15 c# regex multiline

我有一个来自应用程序的非常大的XML输出.我需要使用我的程序处理它,然后将其反馈给原始程序.这个XML中的部分需要填写我们的替换.有趣的部分看起来像这样:

<sys:customtag sys:sid="1" sys:type="Processtart" />
    <sys:tag>value</sys:tag>
    here are some other tags
    <sys:tag>value</sys.tag>
<sys:customtag sys:sid="1" sys:type="Procesend" />
Run Code Online (Sandbox Code Playgroud)

并且该文档包含几个这样的部分.

我需要在这些标记内部获取所有XML部分才能对其进行修改.我写了一个正则表达式来获取这些碎片,但它不起作用:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"output.xml");
Regex regExp = new Regex(@"<sys:customtag(.*?)Processtart(.*?)/>(.*?)<sys:customtag (.*?)Procesend(.*?)/>", RegexOptions.Multiline & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant);
MatchCollection matches = regExp.Matches(xmlDoc.InnerXml);
Run Code Online (Sandbox Code Playgroud)

如果我将所有内容放在一行中并在没有多行选项的情况下调用此正则表达式,它确实会发现每个出现的情况.通过保留文件并设置多行选项,它不起作用.有什么问题,我应该改变什么?或者有没有更容易的方法来获得这些标签之间的XML部分没有正则表达式?

Owe*_*wen 45

我相信使用该选项RegexOptions.Singleline,而不是RegexOptions.Multiline(SRC).允许(.)匹配换行符应该适用于您的情况.

...点也匹配换行符的模式称为"单行模式".这是有点可惜,因为很容易混淆这个词与"多行模式".多行模式只影响锚,和单行模式只能通过指定RegexOptions.Singleline,如Regex.Match("串会影响点...当使用.NET框架的正则表达式类,您激活此模式","正则表达式",RegexOptions.Singleline).


use*_*871 5

正则表达式字符“.” 即使MultiLine设置了选项,也永远不会匹配换行符。相反,您应该使用[\s\S]或其他组合匹配任何东西。

MultiLine选项仅修改 ^(行首而不是字符串开头)和 $(行尾而不是字符串结尾)的行为

顺便说一句:确实,正则表达式不是扫描 HTML 的正确方法......