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


    资料见前一贴
    比如有 <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匹配到时才进行记录?:后面括号的内容).






  • 相关阅读:
    iOS网络开发之AFNetworking
    TCP/IP、Http、Socket的区别
    iOS开发
    iOS 10相关技术
    HTTP协议详解
    HTTPS和HTTP的区别
    CocoaPods
    关于 iOS 10 中 ATS 的问题
    Run Loop详解
    iOS开发项目之MVC与MVVM
  • 原文地址:https://www.cnblogs.com/symbol441/p/912081.html
Copyright © 2020-2023  润新知