这是一个纯粹的学术练习,与正则表达式和我对组合多个模式的理解有关。我有以下示例字符串

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

使用 C# Regex 我试图提取 3 个大写字母的组。

目前,如果我使用模式 >.+?</ 我得到
Found 5 matches:
>JKL</
>MNO</
>PQR</
>VWX</
>BCD</

如果我然后使用 id=".+?"> 我得到
Found 5 matches:
id="ABC">
id="DEF">
id="GHI">
id="STU">
id="YZA">

现在我试图通过对两边的每个术语使用逻辑或 | 来组合它们 id="|>.+?">|</
然而,这并没有给我两种模式的组合结果

我的问题是:
  • 有人可以解释为什么这不能按预期工作吗?
  • 如何更正模式以使两个结果以列出的正确顺序组合在一起
  • 如何进一步增强组合模式以仅提供字母?我希望它仍然是 ?<=?=< 但只是想检查一下。

  • 谢谢

    最佳答案

    您的正则表达式不知道从哪里开始或停止由 | 分隔的替代选项。所以你需要把它们放在子模式中:

    (id="|>).+?(">|</)
    

    然而,regex is not the right tool to parse XML.

    那些圆括号还添加了捕获子模式。这个可以自己退。所以这:
    (id="|>)(.+?)(">|</)
    

    将返回索引 0 处的整个匹配项、索引 1 处的前分隔符、索引 2 处所需的实际匹配项以及索引 3 处的最后一个分隔符。在大多数正则表达式引擎中,您可以这样做:
    (?:id="|>)(.+?)(?:">|</)
    

    以避免捕获分隔符。现在索引 0 将包含整个匹配项,而索引 1 仅包含 3 个字母。不幸的是,我无法告诉您如何在 C# 中检索它们。

    关于c# - 正则表达式逻辑或,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12697442/

    10-11 02:15
    查看更多