删除所有尾随<br/>使用正则表达式,替换组不返回完全匹配

时间:2017-05-17 23:47:04

标签: c# html regex

这是问题所在。我有一块粘贴的HTML文本。我需要从文本中删除尾随换行符和空格。甚至通过关闭标签继续进行。下面的文字只是一个例子,实际上代表了我正在处理的真实文本。

EG:

:此:

<span>Here is some<br></span><br> <span><span>Here is some text</span><br><span><br>&nbsp; </span></span><br><br>

成为这样:

<span>Here is some<br></span><br> <span><span>Here is some text<span></span></span>

我的第一次通过。我使用它:Regex.Replace(htmlString, @"(?:\<br\s*?\>)*$",“”)来摆脱尾随换行符。现在我剩下的就是在关闭标签和空白区域后面的换行符。

我正在尝试使用它:

While(Regex.IsMatch(@"(<br>|\s|&nbsp;)*(<[^>]*>)*$") { Regex.Replace(htmlString, @"(<br>|\s|&nbsp;)*(<[^>]*>)*$", $2) }

正则表达式模式实际上工作得很好,问题是匹配组2的替换只返回一个结束跨度。所以我最终得到了以下内容:

<span>Here is some<br></span><br> <span><span>Here is some text</span></span>

2 个答案:

答案 0 :(得分:0)

我想你可以使用:

resultString = Regex.Replace(subjectString, @"<br>|&nbsp;|\n", "");

Regex Demo

答案 1 :(得分:0)

正则表达式位于@"(<br>|\s|&nbsp;)*(<[^>]*>)*$"。第二组之后是*,意味着该组被重复,因此$2只会产生一次重复的组。

将重复放在一个组中将捕获整个重复。将正则表达式更改为@"(<br>|\s|&nbsp;)*((<[^>]*>)*)$"

请注意,使用*重复第一个组可能会使代码在某些输入字符串上旋转,因为无法保证Replace会将文本更改为其他字符串。由于第一组是可选的(即零个或多个重复),Replace可能会用完全相同的字符串替换一个字符串。所以我建议将正则表达式更改为@"(<br>|\s|&nbsp;)+((<[^>]*>)*)$",这意味着需要出现第一组的一个或多个。