C# 正则逻辑或
这是一个纯学术性的练习,涉及正则表达式和我对分组多种模式的理解。我有以下示例字符串C# 正则逻辑或,c#,regex,C#,Regex,这是一个纯学术性的练习,涉及正则表达式和我对分组多种模式的理解。我有以下示例字符串 <xContext id="ABC"> <xData id="DEF"> <xData id="GHI"> <ID>JKL</ID> <str>MNO</str> <str>PQR</str> <str> <order id="STU"> <str>VWX</str
<xContext id="ABC">
<xData id="DEF">
<xData id="GHI">
<ID>JKL</ID>
<str>MNO</str>
<str>PQR</str>
<str>
<order id="STU">
<str>VWX</str>
</order>
<order id="YZA">
<str>BCD</str>
</order>
</str>
</xContext>
现在,我试图通过对两边的每个术语使用逻辑或
来组合它们id=“|>.+?”>您的正则表达式不知道从何处开始或停止由
分隔的alternativ选项。因此,您需要将它们放在子模式中:
(id="|>).+?(">|</)
(id=“|>).+?(“>| | | |您需要将备选方案分组在一起
(?:id="|>).+?(?:">|</)
(?:id=“|>).+?(?:”>||我建议您使用正则表达式模式(?:(?|捕获组FTW
@">(?<content>.+?)<|id=""(?<content>.+?)"""
@“>(?。+?)我不太明白你想要什么,但是如果你只想要三个大写字母的组\b([A-Z]{3})\b
你确定c#regex中允许使用可变长度的查找吗?我认为查找效率较低,因为字符串必须遍历两次。因此,我认为在这种情况下这有点过火。当然,这是一种更通用的解决方案,因此相当优雅;).@m.buettner-性能方面可能没问题,因为它在不创建反向引用时节省了一些时间(就像您的代码那样)。哈哈,这很公平。在做出此类声明之前,可能应该有人对其进行分析。^^。我只是想提醒大家,lookbehind通常会产生一些开销@Ωmega,是的,c#是我所知道的唯一一种不受外观限制的语言。谢谢-这也给出了正确的答案!我通常在这里测试c#
(id="|>)(.+?)(">|</)
(?:id="|>)(.+?)(?:">|</)
(?:id="|>).+?(?:">|</)
(?<=id="|>).+?(?=">|</)
@">(?<content>.+?)<|id=""(?<content>.+?)"""