Regular Expression学习笔记

正则写法

var re = /a/;//简写
/.../里不能为空,因为会误以为是注释;
var re = new RegExp('a');

新建一个RegExp对象;和新建Array对象,Object对象一样,有简写;

平时建议用简写,因为简写的性能更好;
但如果正则表达式里有非类字符串的类型(其实并不是字符串,只能不知怎么表述),则不能简写,因为/.../里写的只能类字符串类型;

var arr = [];
var arr = new Array();
var obj = {};
var obj = new Object();

正则常用方法

test()

test(): 正则去匹配字符串,如果匹配成功就返回真,如果匹配失败就返回假

语法:正则.test(字符串)

var str = 'abcdef';
var re = /b/;
alert( re.test(str) ); //true

search(): 正则去匹配字符串 , 如果匹配成功,就返回匹配成功的位置,如果匹配失败就返回 -1,和indexof()差不多

语法:字符串.search(正则)
正则默认是区分大小写的;
如果不区分大小写的话,需要在正则的最后加标识i

var str = 'abcdef';
var re = /B/i;
//var re = new RegExp('B','i');
alert( str.search(re) );
match()

match(): 正则去匹配字符串,如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null

语法:`字符串.match(正则)

正则默认匹配成功就会结束,不会继续匹配
如果想全部查找,就要加标识 g(全局匹配)`

replace()

replace(): 正则去匹配字符串,匹配成功的字符去替换成新的字符串

语法:字符串.replace(正则,新的字符串)
第二个参数:可以是字符串,也可以是一个回调函数

var str = 'aaa';
var re = /a+/g;
str = str.replace(re,function(str){
    return str;
    //回调函数的第一个参数:就是匹配成功的字符
});
alert(str);
匹配子项

小括号 () (还有分组操作的意思)

把正则的整体叫做(母亲)
第一个小括号里面的正则,叫做这个第一个子项(母亲的第一个孩子),第二个小括号就是第二个子项

var str = '2013-6-7';
var re = /(\d+)(-)/g;
str = str.replace(re,function($0,$1,$2){
    //第一个参数:$0(母亲),第二个参数 : $1(第一个孩子),第三个参数 : $2(第二个孩子)
    return $1 + '.';
});
alert( str );   //2013.6.7

match()中也有匹配子项

var str = 'abc';
var re1 = /abc/;
var re2 = /(a)(b)(c)/;
alert( str.match(re1) ); //abc
alert( str.match(re2) ); //[abc,a,b,c]
//当match不加g的时候才可以获取到子项的集合
字符类

一组相似的元素,用 [] 中括号的整体代表一个字符,如果想代表多个,则在[]后面加上一个+

var str1 = 'abc';
var str2 = 'abdc';
var re1 = /a[bde]c/;//bde是或的关系
var re2 = /a[bde]+c/;//

alert( re1.test(str1) ); //true
alert( re1.test(str2) ); //false
alert( re2.test(str2) ); //true

排除 ^ : 如果^写在[]里面的话,就代表排除的意思

[]里面还可以写一个范围,但是要从小到大;

var re = /a[a-z0-9A-Z]c/;
常见元字符

. : 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式。

^ : 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置
$ : 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置

\s : 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
\S : 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]

\d : 匹配一个数字字符。等价于 [0-9]
\D : 匹配一个非数字字符。等价于 [^0-9]

\w : 匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_]( 字母 ,数字,下划线_ )
\W : 匹配任何非单词字符。等价于 [^A-Za-z0-9_]

\b: 匹配一个单词边界(起始,结束,空格),也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'
\B: 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'

\r: 匹配一个回车符。等价于 \x0d \cM

\t: 匹配一个制表符。等价于 \x09\cI

\num : 匹配 num,其中 num 是一个正整数。对第num个子项的引用。例如,'(.)\1' 匹配两个连续的相同字符。

量词类:
* : 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}

+ : 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}

? : 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}

{n} : n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o

{n,} : n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'

{n,m} : m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格

? : 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

更多内容看 正则表达式-元字符表

常用表单校验

匹配中文:[\u4e00-\u9fa5]
行首行尾空格:^\s*|\s*$
Email:^\w+@[a-z0-9]+(\.[a-z]+){1,3}$
网址:[a-zA-z]+://[^\s]*
QQ号:[1-9][0-9]{4,9}
邮政编码:[1-9]\d{5}
身份证:[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x

可以把这些正则放到一个空间里,调用起来方便;

var re = {
    qq : /[1-9][0-9]{4,9}/,
    email : /[1-9]\d{5}/,
    ...
}
需要时就调相应的正则:
re.qq.test(str);
posted @ 2017-05-05 17:56  CHENJIAJIE  阅读(166)  评论(0编辑  收藏  举报