【问题标题】:Incorrect Regex in XML node stringXML 节点字符串中的正则表达式不正确
【发布时间】:2021-07-05 11:34:40
【问题描述】:

我正在尝试让Regex 工作,但几个小时后仍然无法破解它!
假设我有这行(在 XML 中):

<MyXMLTag DataMember="$$Date$$" Name="$$DateName$$" DateTimeGroupInterval="MonthYear" DefaultId="$$MyId$$" />

<NameTag>$$item$$</NameTag>

我需要获取以$$ 开头和结尾的单词,但只有那些不以“DataMember="”开头的单词。
理想只存在于DataMember="..."之外的那些。

所以,在这种情况下,我想要匹配 $$Date$$$$MyId$$$$item$$$$DateName$$ 应该被忽略/丢弃。

到目前为止,我已经尝试了以下正则表达式组合:

@"(?<!^\bDataMember="\b)\$\$(.*?)\$\$"

@"(?<!(\w*DataMember="\w*))\$\$(.*?)\$\$"

我还有其他几个相同的变体,但没有一个能让我实现我的目标。
通过这些组合,我得到了这个(不正确的)结果:

$$" Name="$$
$$" Name="$$
$$" DateTimeGroupInterval="MonthYear" DefaultId="$$

您是否可以看到它正在捕获 XML 属性之间的单词!
我想要的是用自定义文本替换 $$ 之间的文本。

我不需要处理 XML 本身,因为我可以使用多种工具,但只能使用 $$ 之间的文本。考虑到代码不知道文本是否在标签、属性、根节点、子节点内,一次或多次...

帮助?!

【问题讨论】:

  • 您为什么要尝试使用正则表达式解析 XML,而不是使用专用的 XML 解析器?正则表达式不是一个很好的工具。
  • 当然你可以试试(?&lt;=(?&lt;!\bDataMember=)")\$\$[^"]*?\$\$(?="),但你真的应该考虑使用正确的工具来完成任务。
  • 没有@Amy,你可以忽略 XML 部分(只是一个例子)。它可以像string 行一样简单,格式相似(例如:Key="$$key$$")。
  • 我们不能忽视这一点。一旦您发布示例输入,每个人都会开始思考您使用的工具是否适合该任务。当您准备好所有工具时,在 C# 中使用正则表达式解析 XML 确实没有意义。
  • 如果您的输入是格式正确的 XML,我会总是使用 XML 解析器,而根本不用正则表达式。如果它不是格式良好,我会使用更宽容的 HTML 解析器,但仍然不使用正则表达式。

标签: c# regex winforms


【解决方案1】:

不要匹配两个 $$ 分隔符之间的 anything,而是寻找连续的单词字符:

new Regex(@"(?<!\bDataMember="")\$\$(\w+)\$\$");

匹配 $$DateName$$$$MyId$$$$item$$ 类似

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2011-01-17
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多