zoukankan      html  css  js  c++  java
  • C# 正则表达式中要注意的地方

    面有文章已经说了“.+?”、“.*?”、“.+”、“.*”的理解方式,现在再简单说一下容易出问题的地方。

    前模式“.+?”后模式(当后模式不仅仅是一个字符时有可能发生理解错误)

    在内容1已经匹配了前模式的情况下,“.+?”的匹配范围是根据后模式来确定的。这里容易发生的理解错误是以为“.+?”的范围以?问号之后的模式的第一个字符来确定,其实应该以整个后模式来判断。例如正则表达式:
    "(?<引号内容>.+?)"A  
    对于输入字符串:
    "试验"B"A"
    其捕获组<引号内容>匹配的内容是:试验"B
    一般的理解错误是以为不应该包括B之前的引号,应该是匹配A,以为到B之前的引号原来的匹配尝试就应该抛弃,而重新从B开始寻找匹配。其实判断.+?的范围不是单以引号来判断的,而是以 "A 这一整个后模式来判断的。要正确的匹配内容,应该把点号.换成不允许的字符,此例中为引中",所以应该这样写正则表达式:"(?<引号内容> [^"]+?)"A

    .*?

    和.+?差不多一样,只是可以没有任何字符被包括在其范围内。也就是从0开始。

    .+ .* 与加上?号之后的不同:没有问号的,都是从后往前找,有问号的,从前往后找。

    看不见的空格、两个换行符、\t

    这些字符在正则表达式中也是有意义的,正则表达式不会忽略前导的空格或尾部的空格,虽然你可能看不到它们。注意在编辑框中的换行其实是两个字符:\r\n,所以你虽然只看到新的一行,但其实是有两个看不见的字符在那里。

    注意转义字符和字面字符

    本身有字面意义,又在正则表达式引擎中有特殊意义的字符:点号.问号?加号+乘号*减号-斜杠\左括号[、(、{
    现在的问题是,要匹配的内容中有上面这些符号,比如加号+,并不需要代表特别的含义,就仅是匹配其字面意义,则正则表达式为 \\+

    另外一个问题是,有一个输入编辑框,用户可以在里面输入其想匹配的内容,其输入的任何一个字符仅代表字面意义而不是正则表达式(也就是说,也许用户根本不知道什么是正则表达式,他只是想搜索一模一样的字符串而已)。如果其输入中有+加号怎么办呢?

    必须用Replace()等函数把+换成\\+,上面所举的转义字符也要这样处理才行。我们无法预见到用户可能会输入哪一个具有转义意义的字符,所以得这样写替换用的正则表达式
    @"(?<转义字符>[\^\$\(\)\[\]\{\}\.\?\+\*\|\\]",@"\\${转义字符}"

    A标签的正则表达式

    "<a [^>]*?href=(?(['\"])[\"'](?<URI>[^\"'>]+?)[\"']|\\s*(?< URI>[^\"'\\s>]+))[^>]*>(?<标题>(?> [^<]*))</a>";//匹配A标签中的URI

    IMG标签的正则表达式(仅匹配JPG文件)

    <img [^>]*?src=(?([\"'])[\"'](?<URI>\s*[^\"'>\s]+?\\.jpg)[\"']|(?<URI>\s*[^\"'>\s]+?\\.jpg))

    以上都考虑了不规范的情况:1是不加引号,2是用单引号而不是双引号.


  • 相关阅读:
    可扩展多线程异步Socket服务器框架EMTASS 2.0
    认识迅雷界面引擎
    C语言 二维数组(指针)动态分配和释放(转)
    二维数组与双重指针(转)
    VC++6 调用teststand api的方法
    [VC6] 小谈如何解决VC6.0 open崩溃的问题(已解决)(转)
    Linux下C与Mysql的混合编程(转)
    VS2010生成安装包制作步骤 (转)
    SAO总结
    JS OOP编程
  • 原文地址:https://www.cnblogs.com/yeye518/p/2231624.html
Copyright © 2011-2022 走看看