正则表达式的正反向预编译

资料见前一贴
比如有 <table id="table1"><tr><td><a href=www.csdn.net title="CSDN"></a></td></tr></table>
用正则表达式匹配获得<a href="www.csdn.net" title="CSDN"></a>

如果你网页当中的格式是固定的
<table id="table1" > 
<tr>
<td><a href="www.csdn.net" title="CSDN"></a></td  >
</tr>
</table>
这样就可以实现
(?<=<table (.*?>)\n*<tr>\n*<td>)(?:.|\n)*?(?=</td>\n*</tr>\n*</table>)

注意实际使用时其中的转义字符。

可以这样拼接一个正则表达式:
string start = @"<table(.*?>)\n*<tr>\n*<td>";
string end = @"</td>\n*</tr>\n*</Table>";
string regExp = @"(?<=" + start + ")" + "(?:.|\n)*?" + "(?=" + end + ")";
string result = System.Text.RegularExpressions.Regex.Match(@"<table id= runat=server><tr><td>symbolsnhame</td></tr></Table>", regExp).Value;
MessageBox.Show(result);


总结出一个通用匹配表达式
string regExp = "(? <=" + "开头标志" + ")" + "(?:. |\n)*?" + "(?=" + "结束标志" + ")";

我们再为其扩展一下,因为有时<tr ><td>都会有这种标签<td class="NavLeftCell">当我们遇上这种问题时将不能匹配到想要的字符串,不过我们只需要进行一些简单的扩展就可以实现匹配.

string start = @"<table(.*?>)\n*<tr(.*?>)[\n]*<td(.*?>)";
string end = @"</td>\n*</tr>\n*</Table>";



技术资料:
反向预搜索:"(?<=xxxxx)","(?<!xxxxx)"

    这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 "左侧",两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 "正向预搜索" 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。

    举例5:表达式 "(?<=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。由于 JScript.RegExp 不支持反向预搜索,因此,本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索,比如:Java 1.4 以上的 java.util.regex 包,.NET 中

括号 "( )" 内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用 "(?:xxxxx)" 格式

    举例1:表达式 "(?:(\w)\1)+" 匹配 "a bbccdd efg" 时,结果是 "bbccdd"。括号 "(?:)" 范围的匹配结果不进行记录,因此 "(\w)" 使用 "\1" 来引用。(在\1匹配到时才进行记录?:后面括号的内容).






原文地址:https://www.cnblogs.com/symbol441/p/912081.html