js正则学习
一直对正则很纠结也很畏惧,以前感觉花时间理解一个个奇奇怪怪的符号,还不如直接百度谷歌之。
但知其然不知其所以然也是种痛苦,所以花了两天稍微学了一下,虽然没学很深入彻底,但也比之前进步不少,特此笔记。
js正则
g:表示全局,匹配全部
i:表示不区分大小写
m:表示匹配多行(匹配换行两端的潜在匹配)
RegExp实例属性:
global:是否设置了g
ignoreCase:是否设置了i
lastIndex:表示下一次exec开始搜索下个匹配项的字符位置
multiline:表示是否设置了m
source:正则表达式的字符串表示
RegExp实例方法:
exec(str);用于捕获组(用小括号指定一个子表达式),返回包含第一个匹配项信息的数组。
test(str);用于验证是否匹配,返回true或false。
RegExp构造函数属性:
input[$_]:最近一次要匹配的字符串,opera未实现
lastMatch[$&]:最近一次匹配项,opear未实现
lastParen[$+]:最近一次匹配的捕获组,opera未实现
leftContext[$’]:input字符串中lastMatch之前的文本
multiline[$*]:表示是否所有表达式都是用多行模式,ie和Opera不支持
rightContext[$']:input字符串中lastMatch之后的文本
\ :转义字符
^ : 匹配字符串开头,如/^a/ 匹配 an A 而不匹配 An a
$ : 匹配字符串结尾,如/a$/ 匹配 An a 而不匹配 an A
* : 匹配匹配前面元字符0或多次 /ba*/将匹配b,ba,baa,baaa * = {0,}
+ : 匹配前面元字符1次或多次 /ba+/ 匹配ba + = {1,}
? : 匹配前面元字符0次或1次,/ba?/将匹配b,ba ? = {0,1}
(x) 匹配x保存x在名为$1...$9的变量中
.匹配除行结束符意外的任何字符
x|y 匹配x或y
{n} 精确匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
[xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符)
[^xyz] 不匹配这个集合中的任何一个字符
[\b] 匹配一个退格符
\b 匹配一个单词的边界
\B 匹配一个单词的非边界
\cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M
\d 匹配一个字数字符,/\d/ = /[0-9]/
\D 匹配一个非字数字符,/\D/ = /[^0-9]/
\n 匹配一个换行符
\r 匹配一个回车符
\s 匹配一个空白字符,包括\n,\r,\f,\t,\v等
\S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/
\t 匹配一个制表符,tab建
\v 匹配一个重直制表符
\w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9]
\W 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。
\1 对第一个捕获组的文本进行引用,用于再次匹配 如:(...)...\1
(?=) 向前正匹配 (?!)向前负匹配
以上就是大部分常用的令人生畏的正则语法,用了之后其实常用的也是有规律可寻,难以概况但熟能生巧。
下面就是从书中摘取的实例:
//正则表达式: function testUrl(){ var pt = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/; //pt解析: // ^ 匹配字符串开头 // (?:(A-Za-z+):)? ?:表示非捕获组 (A-Za-z+):表示匹配字母后加:,且是第一个捕获组 ?表示分组可选 // (\/{0,3}) ()表示第二个捕获组 \/转义,匹配/ {0,3}匹配前面字符0-3次 // ([0-9.\-A-Za-z]+) ()第三个捕获组 []匹配方括号内的字符 0-9 . - A-Za-z 匹配这四种字符 +多个 // (?::(\d+))? ?:非捕获组 :匹配冒号开始 (\d+)第四个捕获组,匹配多个数字 ?可选 // (?:\/([^?#]*))? \/匹配/ ([^?#]*)第五个捕获组,匹配除?#外的字符 *该字符类将匹配n次 // (?:\?([^#]*))? \?匹配? ([^#]*)第六个捕获组,匹配除#外的字符 *匹配多次 // (?:#(.*))? #匹配# (.*)第七个捕获组 .匹配除结束符外的所有字符 *匹配多次 // $ 字符串结束 var url = 'http://www.ora.com:80/goodparts/abcde?q#fragment'; var res = pt.exec(url); var names = ['url','scheme','slash','host','port','path','query','hash']; var blanks = ' '; for(var i=0;i<names.length;i++){ console.log(names[i]+':'+blanks.substring(names[i].length),res[i]); } }
function testNumber(){ var pt = /^-?\d+(?:.\d*)?(?:e[+\-]?\d+)?$/i; //pt解析 // ^ $ 分别匹配开头和结尾 // -? -匹配0次或一次,也就是可选 // \d+ 匹配至少一个数字 // (?:.\d*)? ?:非捕获组 .匹配小数点 \d* 小数点后匹配任意个数字 ?可选 // (?:e[+\-]?\d+)? ?:非捕获组 e匹配e和E [+\-] 匹配加号或者减号 ?可选 \d+匹配一个以上数字 ?可选 console.log(pt.test(-1)); console.log(pt.test(100.1993)); console.log(pt.test("sss")); console.log(pt.test(123.45E-67)); }
正则中用法比较重要的个人感觉就是捕获组,和非捕获组,捕获组在replace方法中也会很有用,比如创建模板模式,通过一些匹配替换内容。