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

时间:2014-08-05 16:06:19

标签: c# regex

这是关于操纵HTML的问题。我在上一篇文章中并不清楚,所以我遵循这些建议并重新发布。

我有一个长字符串,为了可视化,可以显示为XML。我正在尝试操作代码块。此外,该问题包含一个关于构造模式时我想到的步骤的列表。问题是(也)关于我哪里出错了。

我正在尝试将标签与某些名称匹配,并使用以下代码“忽略”它们。

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

这对于简单标签来说是有效的,但对于复杂的标签来说则是失败的,即这种标签中包含子节点。至少我认为这是该问题的签名,就像我所见。

我猜这与其中一个儿童标签的闭合钳有关,但我不能为我的生活看到问题。

正则表达式是这样的:

  1. 选择一个开头 - 后跟标签名称
  2. 贪婪地匹配一些或没有字符而不是尾巴
  3. 当找到颌骨时,贪婪地匹配至少一个角色
  4. 当发现端颚跟着开始钳口时,匹配标签名称
  5. 与尾颌匹配
  6. 问题是我可以匹配 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>
    

1 个答案:

答案 0 :(得分:1)

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

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>