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