前言:为一些特殊环境字符串匹配或截取所学
用于字符串
regexp.exec, regexp.test, string.match, string.replace, string.search, string.split.
用例子来学习
var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9,\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var url = "http://www.ora.com:80/goodpats?q#fragment";
这是从javascript精粹中的例子,用来匹配url,看到这里是不是晕了,拆分成一个个来看吧,希望读者在看的时候也动手检验,可以用网页调试进行测试。
^
表示匹配字符串开始
(?:([A-Za-z]+):)?
(?:...)表示非捕获型分组(可以理解为可以匹配,但是不返回结果分组里面去,regexp.exec可以让你明白这一点)
[...]表示匹配的字符串类,
+表示匹配一次或者更多,
跟着的:表示最后有一个:,
后缀?表示这个分组可有可无,也就是说这个表达式可以不进行匹配。
(\/{0,3})
(...)表示捕获型分组,regexp.exec匹配的字符串会返回结果分组中,
\/转义为/字符,这个\为转义符应该好理解,一些正则表达式中的特殊字符需要进行转义,
{0,3}表示匹配0到3次之间,用{3,}可以表示匹配三次以上。
([0-9.\-A-Za-z]+) 捕获型分组
\-转义为‘-’字符,
[0-9.\-A-Za-z]匹配0-9,‘.’,‘-’,A-Z, a-z字符,
+表示匹配1次或者更多。
(?::(\d+))?
(?:...)?非捕获型可选分组,
:最前面匹配一个:字符,
(\d+) \d表示一个数学字符,+匹配一次以上,那么总的表示返回匹配了数学字符的捕获分组。
(?:\/([^?#]*))?
(?:...)?表示非捕获型可选分组,
\/转义为字符‘/’,并且首先被匹配,
[^?#] ^可表示非,表示匹配?#之外的所有字符,
*表示匹配0次或者更多,与+匹配一次以上相区别,
([^?#] *)表示捕获型分组,返回匹配结果分组。
接下来大家可以自己分解。
(?:\?([^#]*))?
(?:...)?非捕获型可选分组,
\?转义为?,首端匹配?,
([^#]*)捕获型分组,匹配除了#字符一次以上的字符串。
(?:#(.*))? 非捕获型可选分组
#开头匹配,
(.*)表示匹配换行符\n以外所有字符0次以上的捕获型分组
$
表示匹配字符串末尾
这是第一章,还有下一章
注:若有不妥之处,欢迎指正