No.014 JavaScript中的正则表达式
JavaScript中的正则表达式
(以下所有内容仅用以记录学习过程中的个人理解,如有错误欢迎指出)
1. 基础
1.1 创建正则对象
创建正则对象有两种方式:
- 字面量创建:
var reg = /正则表达式/匹配模式
var reg = /xyz/;
- 构造函数创建:
var reg = new RegExp("正则表达式","匹配模式");
var reg = new RegExp("xyz");
上述两种写法等价,都创建了一个内容是 xyz 的正则对象。
1.2 正则语法
匹配模式
正则表达式的匹配模式有:
-
修饰符i
:忽略大小写; -
修饰符g
:全局匹配模式,
不用g,从左到右匹配到第一个符合条件的就会返回;
使用g,从左到右找到所有符合条件的字符,直到结尾。
正则语法
正则表达式的常用语法有:
-
|
:表示或; -
[ ]
:中括号中的内容全部为或; -
[^]
:表示除了括号中的内容; -
[a-z]
:表示任意小写字母; -
[A-Z]
:表示任意大写字母; -
[A-z]
:表示任意字母; -
[0-9]
:表示任意数字。
1.3 测试方法
正则表达式主要的测试方法是test(字符串)
,用于判断字符串中是否含有指定模式的子串。
var reg = new RegExp("ac");
var str = "abcd";
var result = reg.test(reg);
alert(result); //true
1.4 捕获与子表达式
在正则表达式中用括号括起来的内容,我们称之为子表达式。如var reg = /\d(\d)\d/gi
中的(\d)
。
当子表达式在字符串中匹配到对应内容的时候,系统会自动捕获这个行为,然后将匹配的内容放入系统缓存区中,这个过程就称之为捕获。
同时在正则表达式中,我们可以用\n
(n为正整数,表示系统缓冲区编号)来获取缓冲区中的内容,这个过程称之为反向引用。
反向引用可以在如下例子的情况用到:
- 查找形如1221,3443的数字:
var reg = /(\d)(\d)\2\1/gi
; - 查找形如AABB,TTMM的字符串:
var reg = /([A-Z])\1([A-Z])\2/gi
; - 查找连续四个字符相同的字符串:
var reg = /([0-9A-z])\1\1\1/gi
。
2. 正则语法
2.1 匹配符
匹配符用于匹配某个或某些字符。
在正则表达式中,通过一对中括号括起来的内容,我们称之为字符簇,字符簇表示一个范围,但匹配时只匹配其中一个字符:
-
[A-z]
,匹配A到z之间的任一字母; -
[0-9]
,匹配0到9之间的任一数字; -
[0-9A-z]
,匹配0到9或A到z之间的任一字符; -
[abcd]
,匹配a或b或c或d……等等等等。
同时还有一些简写的元字符:
-
\d
和\D
,匹配任意数字/非数字; -
\s
和\S
,匹配任意空白字符/非空白字符; -
\w
和\W
,匹配任意字母数字下划线字符/非字母数字下划线字符。
举例如下:
var reg = /\w/g; //匹配数字字母下划线
var str = "a你b们c好1啊2";
console.log(str.match(reg)); //["a", "b", "c", "1", "2"]
2.2 限定符
限定符可以指定正则表达式的一个给定字符必须要出现多少次才能满足匹配:
-
*
:匹配前面的子表达式零次或多次,0到多; -
+
:匹配前面的子表达式一次或多次,1到多; -
?
:匹配前面的子表达式零次或一次,0或1; -
{n}
:匹配n次 ; -
{n,}
:至少匹配n次 ; -
{n,m}
:最少匹配n次,且最多匹配m次。
举例如下:
var str = "我的号码是1111122222,你的是33333吗";
var reg = /[1-9]{2,6}/g;
console.log(str.match(reg)); //["111112", "2222", "33333"]
2.3 定位符
定位符能让正则表达式匹配到开头或结尾或边界的某个位置:
-
^
:匹配开头的指定字符:^
在字符簇中是取反的意思,在一般表达式中是匹配开头的意思; -
$
:匹配结尾的指定字符; -
\b
和\B
,匹配单词边界/非单词边界。
var str1 = "abc"; var reg1 = /^a/; //以a开头
var str2 = "cba"; var reg2 = /a$/; //以a结尾
var str3 = "a"; var reg3 = /^a$/; //以a开头和结尾,即只有a
console.log(reg1.test(str1)); //true
console.log(reg2.test(str2)); //true
console.log(reg3.test(str3)); //true
3. 正则方法
3.1 split()
split() 可以接收一个正则表达式作为参数,根据它去拆分字符串,同时会全部拆分,无需设置全局匹配。
var str = "1a2a3a4a5";
var result = str.split(/[A-z]/);
console.log(result); //["1", "2", "3", "4", "5"]
3.2 search()
search() 可以接收一个正则表达式作为参数,根据它去检索字符串是否含有指定内容。
检索到则会且只会返回第一次出现位置的索引,设置全局匹配也无效;未检索到则返回-1。
var str = "abc adc aec afc";
var result = str.search(/a[def]c/);
console.log(result); //4
3.3 match()
match() 可以接收一个正则表达式作为参数,将字符串中符合条件的第一个内容提取出来。
可以通过g
全局匹配模式,匹配到所有内容。
var str = "1a1b1c1d1e1f1g1";
var result1 = str.match(/[a-z]/);
var result2 = str.match(/[a-z]/g);
console.log(result1); //["a", index: 1, input: "1a1b1c1d1e1f1g1"]
console.log(result2); //["a", "b", "c", "d", "e", "f", "g"]
3.4 replace()
replace() 可以接收一个正则表达式作为参数,将字符串中符合条件的第一个内容替换成新的内容。
可以通过g
全局匹配模式,匹配到所有内容。
var str = "1a1b1c1";
var result1 = str.replace(/[0-9]/,"&");
var result2 = str.replace(/[0-9]/g,"");
console.log(result1); //&a1b1c1
console.log(result2); //abc