【问题标题】:C# Regex.Replace does not replaceC# Regex.Replace 不替换
【发布时间】:2014-02-17 15:03:48
【问题描述】:

我有一个小问题要请教各位天才。

我已经使用“RegexLab”测试了一种用于替换/过滤文本的模式。它在那里工作得很好,但我的代码做得不好。

模式:

<li>(.*?)<ul>.*?</ul>

替换

<li>$1

输入:

<b>Title</b>\n<br/>\n<ul><li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n</ul>\n<b>Title</b><br/>\n<ul><li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n</ul>

输出应该是什么样的:

<b>Title</b>\n<br/>\n<ul><li>Text\n</li>\n<li>Text\n</li>\n<li>Text\n</li>\n<li>Text\n</li>\n<li>Text\n</li>\n<li>Text\n</li>\n</ul>\n<b>Title</b><br/>\n<ul><li>Text\n</li>\n<li>Text\n</li>\n<li>Text\n</li>\n<li>Text\n</li>\n<li>Text\n</li>\n</ul>

我的代码:

string filteredText = Regex.Replace(Input, Pattern, Replacement);

问题:

我的输出是错误的,我没有得到过滤后的文本,我得到了整个未过滤的输入。 RegexLab 告诉我一切都是正确的。

整个代码(这里看起来很脏)

           string input = "<b>Title</b>\n<br/>\n<ul><li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n</ul>\n<b>Title</b><br/>\n<ul><li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n<li><b>Text</b>\n<ul><li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n<li>Trash</li>\n</ul>\n</li>\n</ul>";
        string pattern = @"<li>(.*?)<ul>.*?</ul>";
        string replacement = "<li>$1";
        string filteredText = Regex.Replace(input, pattern, replacement);

PHP 中的工作代码(C# 中需要):

preg_replace("/<li>(.*?)<ul>.*?<\/ul>/s",'<li>$1',$input);

我需要一个没有 HtmlAgilityPack 的解决方案!

【问题讨论】:

  • 也许是时候切换到例如HTML Agility Pack,而不是试图通过正则表达式来破坏这一切。
  • 它适用于 PHP,但我也希望它适用于 C#。
  • 您的代码示例中的模式与您问题中的模式不匹配。
  • 哦,对不起。我的错。那里复制了错误的模式。
  • @user3319473 你检查过RegexOptions吗?也许 PHP 的默认选项与 .NET 不同。

标签: c# regex replace


【解决方案1】:

尝试:

Regex.Replace(input, pattern, replacement, RegexOptions.Singleline);

您需要让解释器将整个字符串视为单行文本,否则.(点)将与\n(换行)不匹配

【讨论】:

猜你喜欢
  • 2011-05-20
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 2020-06-09
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多