C#Regex.Replace不替换

时间:2014-02-17 15:03:49

标签: c# regex replace

我对你的天才有点问题。

我测试了一个带有“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的解决方案!

1 个答案:

答案 0 :(得分:4)

尝试:

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

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