正则表达式不匹配字符串的某些片段

本文关键字:片段 不匹配 字符串 正则表达式 | 更新日期: 2023-09-27 18:16:24

这是不是关于操作HTML的问题。在我之前的帖子中没有明确说明,所以我遵循建议并重新发布。

我有一个很长的字符串,为了可视化起见,它可以显示为XML。我正在尝试操作代码块。此外,问题还包含了关于我在构建模式时如何计算的步骤列表。这个问题也是关于我哪里错了。

我正在尝试使用以下代码匹配具有特定名称的标签并"忽略"它们。

foreach (string ignoree in ignorees)
{
  Regex regex = new Regex("<" + ignoree + "[^>]*>.+</" + ignoree + ">");
  text = regex.Replace(text, "&");
}

除了对简单的标签有效,但对复杂的标签不起作用,比如有子标签的标签。至少我认为这是问题的标志,就我所见。

我猜这和其中一个子标签的下颚有关,但是我怎么也看不出有什么问题。

正则表达式如下:

  1. 选择start-jaws后跟标签名称
  2. 贪婪地匹配它,一些或没有字符不是end-jaws
  3. 当找到end-jaws时,贪婪地匹配至少一个字符
  4. 当发现end-jaws后跟start-jaws时,匹配标签名称
  5. 与端颚匹配

问题是我可以匹配cc标签,但不匹配dd标签。

<aa>
  <bb>
    <cc>c</cc>
    <dd>
      <ee>e</ee>
    </dd>
  </bb>
  <bb>
    <cc>c</cc>
    <dd>
      <ee>e</ee>
    </dd>
  </bb>
</aa>
<aa>
  <bb>
    &
    <dd>
      <ee>e</ee>
    </dd>
  </bb>
  <bb>
    &
    <dd>
      <ee>e</ee>
    </dd>
  </bb>
</aa>

正则表达式不匹配字符串的某些片段

如果使用延迟匹配会发生什么?

Regex regex = new Regex("<" + ignoree + "[^>]*>.*?</" + ignoree + ">");

此外,您是否使用多行匹配?

如果运行以下代码:

string text = "<aa><bb><cc>c</cc><dd><ee>e</ee></dd></bb><bb><cc>c</cc><dd><ee>e</ee></dd></bb>‌​</aa> and <aa><bb>&<dd><ee>e</ee></dd></bb><bb>&<dd><ee>e</ee></dd></bb></aa>";
foreach(string ignoree in new string[] {"dd","cc"}) {
    Regex regex = new Regex("<" + ignoree + "[^>]*?>.*?</" + ignoree + ">");
    text = regex.Replace(text, "&");
}
Console.WriteLine(text);

结果是(格式化,缩进不是结果的一部分):

<aa>
    <bb>&&</bb>
    <bb>&&</bb>‌
​</aa>
and
<aa>
    <bb>&&</bb>
    <bb>&&</bb>
</aa>