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是用单引号而不是双引号.


posted @ 2011-07-27 12:53  天涯海客  阅读(340)  评论(0编辑  收藏  举报