正则表达式需要替换解释

时间:2015-01-30 11:55:01

标签: c# html regex xml

我有一些代码在HTML被loade3d转换为XML文档时导致错误。有几个正则表达式替换操作,而不是正则表达式专家,我很难理解他们做了什么。

因此定义正则表达式:

private static Regex CleanseInlineTableBorder = new Regex("(?<TableTag><table[^>]*)border=\"1\"", rOpts);

使用方式如下:

fragContent = CleanseInlineTableBorder.Replace(fragContent, "${TableTag};");

但是,在删除表格边框标记后,它似乎会留下尾随的半冒号,例如

名称不能以&#39;;&#39;开头。字符,十六进制值0x3B。第31行,第993号。

之前的HTML:<table tabIndex="-1" class="msoUcTable" style="BORDER-TOP-STYLE: none; WORD-WRAP: break-word; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; TABLE-LAYOUT: fixed; BORDER-BOTTOM-STYLE: none; BORDER-RIGHT-STYLE: none; WIDTH: 167px" cellPadding="0" width="168" border="1">

HTML AFTER:<table tabIndex="-1" class="msoUcTable" style="BORDER-TOP-STYLE: none; WORD-WRAP: break-word; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; TABLE-LAYOUT: fixed; BORDER-BOTTOM-STYLE: none; BORDER-RIGHT-STYLE: none; WIDTH: 167px" cellPadding="0" width="168" ;>

我已经尝试从正则表达式中删除分号:

fragContent = CleanseInlineTableBorder.Replace(fragContent, "${TableTag}");

但这没有用。

有什么方法可以通过改变正则表达式来删除分号吗?

2 个答案:

答案 0 :(得分:1)

fragContent = CleanseInlineTableBorder.Replace(fragContent, "${TableTag}");

这应该为你做。参见演示。

https://regex101.com/r/vD5iH9/16

如果您提到的代码相同,则无法显示

:。如果仍然存在,则需要检查源代码html。

答案 1 :(得分:1)

您的解决方案

fragContent = CleanseInlineTableBorder.Replace(fragContent, "${TableTag}");

应该假设fragContent最初包含你所谓的“之前的HTML”。你确定fragContent的值实际上包含;应用正则表达式后,还是直接检查除fragContent之外的任何其他输出?

我将解释你的正则表达式的作用:

(?<NAME>regex)

定义一个命名的捕获组,这意味着您要查找与正则表达式匹配的内容并为结果指定NAME。您可以稍后使用$ {NAME}来访问正则表达式的匹配项。因此:

(?<TableTag><table[^>]*)

最多匹配

<table tabIndex="-1" class="msoUcTable" style="BORDER-TOP-STYLE: none; WORD-WRAP: break-word; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; TABLE-LAYOUT: fixed; BORDER-BOTTOM-STYLE: none; BORDER-RIGHT-STYLE: none; WIDTH: 167px" cellPadding="0" width="168" border="1"

因为它以“&lt; table”开头并收集任意数量的符号,直到它遇到“&gt;”。但是你把表达式

border=\"1\"

在它后面,匹配“border =”1“”。

因此,HTML标记中唯一满足整个正则表达式的匹配是

    <table tabIndex="-1" class="msoUcTable" style="BORDER-TOP-STYLE: none; WORD-WRAP: break-word; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; TABLE-LAYOUT: fixed; BORDER-BOTTOM-STYLE: none; BORDER-RIGHT-STYLE: none; WIDTH: 167px" cellPadding="0" width="168" border="1"

匹配的部分

(?<TableTag><table[^>]*)

(意思是整个陈述,除了border =“1”)被命名为“TableTag”。

最后致电

CleanseInlineTableBorder.Replace(fragContent, "${TableTag};"); 

你带上你的初始HTML标签并将你的正则表达式(除“&gt;”之外的所有内容)的匹配替换为“TableTag”,这是

    <table tabIndex="-1" class="msoUcTable" style="BORDER-TOP-STYLE: none; WORD-WRAP: break-word; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; TABLE-LAYOUT: fixed; BORDER-BOTTOM-STYLE: none; BORDER-RIGHT-STYLE: none; WIDTH: 167px" cellPadding="0" width="168" 

你看到删除“;”后从你的“替换”电话中,正则表达式中应该没有任何东西可以产生“;”。