我有一些代码在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}");
但这没有用。
有什么方法可以通过改变正则表达式来删除分号吗?
答案 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"
你看到删除“;”后从你的“替换”电话中,正则表达式中应该没有任何东西可以产生“;”。