\符号是转义操作符。例如:
\n 换行符
\f 分页符
\r 回车
\t 制表符
\v 垂直制表符
\\ 匹配“\”
\/ 匹配“/”
\s 任何白字符,包括空格、制表符、分页符等。等价于“[ \f\n\r\t\v]”
\S 任何非空白的字符。等价于“^\f\n\r\t\v]”
\w 任何单词字符,包括字母和下划线。等价于“[A-Za-z0-9_]”
\W 任何非单词字符。等价于“[^A-Za-z0-9_]”
\b匹配单词的结尾。例如:
ve\b 匹配单词“love”等,但不匹配“very”、“even”等
\B匹配单词的开头。例如:
ve\B 匹配单词“very”等,但不匹配“love”等
\d匹配一个数字字符,等价于[0-9]。例如:
abc\dxyz 匹配“abc2xyz”、“abc4xyz”等,但不匹配“abcaxyz”、“abc-xyz”等
\D匹配一个非数字字符,等价于[^0-9]。例如:
abc\Dxyz 匹配“abcaxyz”、“abc-xyz”等,但不匹配“abc2xyz”、“abc4xyz”等
\NUM匹配NUM个(其中NUM为一个正整数),引用回到记住的匹配。例如:
(.)\1 匹配两个连续相同的字符。
\oNUM匹配n(其中n为一个小于256的八进制换码值)。例如:
\o011 匹配制表符
\xNUM匹配NUM(其中NUM为一个小于256的十六进制换码值)。例如:
\x41 匹配字符“A”
五、实例分析
1)在字符串中精确查找链接地址
((http|https|ftp):(\/\/|\\\\)((\w)+[.]){1,}(net|com|cn|org|cc|tv|[0-9]{1,3})(((\/[\~]*|\\[\~]*)
(\w)+)|[.](\w)+)*(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*)
我们知道,链接地址一般以http或者https或者ftp等形式出现。初步总结一下就是,链接地址必须符合如下条件:
条件1
以或者https://或者ftp://等开头(当然还有其它形式,这里只列出主要的)
条件2
后面必须跟一个单词字符,紧接着单词字符后面的是"."(这样的组合必须出现一次或多次)。紧跟着“.”后面的是域名后缀(如net或者com或者cn等,如果是以IP地址的形式出现就可以是数字)
条件3
出现完整的链接地址后,还可以出现下一级或者更多级的目录(还要注意个人主页的地址有可能出现"~"符号)
条件4
链接地址末尾可以带参数。如典型的页数?PageNo=2&action=display等
现在我们用下面的代码来逐个匹配上面的条件——
1、((http|https|ftp):(\/\/|\\\\) 满足条件1
表示 http:\\ https:// https:\\ ftp:// ftp:\\都匹配(在这里考虑了某些用户可能把"//"输成“\\”的易发性错误)
注意:"|"表示“或者”,"\"是转义字符。“\/\/”表示"//",“\\\\”表示"\\"
2、((\w)+[.]){1,}(net|com|cn|org|cc|tv|[0-9]{1,3}) 满足条件2
“((\w)+[.]){1,}”表示一个单词字符加一个点号可以出现1次或者多次(这里考虑了某些用户喜欢省略www而将写成)
“(net|com|cn|org|cc|tv|[0-9]{1,3})”表示必须要以net或者com或者cn或者org或者cc或者tv或者三位以下的数字结束
[0-9]{1,3}表示三位以下的数字,因为ip地址的任何段不能超过255
3、(((\/[\~]*|\\[\~]*)(\w)+)|[.](\w)+)* 满足条件3
“(\/[\~]*|\\[\~]*)”表示可以出现"/~"或者是"\~",(其中“[\~]*”表示 ~ 可以出现也可以不出现),因为不是每个链接地址都有下一级目录
“(\w)+)|[.](\w)+)”表示必须出现一个单词字符(即目录或者是一个带有扩展名的文件)
注意:最后还有一个“*”表示上面括号内的可以出现也可以不出现,否则就只能匹配有下一级目录的链接地址了。
4、(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*)满足条件4
“((([?](\w)+){1}[=]*))*((\w)+){1}”表示形如"?PageNo=2"的字符串可以出现也可以不出现,如果出现则只能出现一次(因为不可能有两个“?”号出现)。
“([\&](\w)+[\=](\w)+)*)”表示形如“&action=display”的字符串可以出现也可以不出现(因为并不是每个网页都带有两个以上的参数。
整个“((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*”表示形如“?PageNo=2&action=display”的字符串可以出现也可以不出现(即链接地址可以有参数也可以没有参数)
把上面的组合起来,我们就可以匹配一个比较全面的链接地址了。比用简单的“(http:\/\/\S+)”来匹配一个链接地址要好,读者可以自行行测试比较。当然,这段代码还有很多不足之处,希望大家能够继续改进。