正则表达式

正则表达式

正则表达式(Regular Expression):由一些普通字符和特殊字符组成的,用以描述一种特定的字符规则的表达式。
正则表达式常用于在一段文本中搜索、匹配或替换特定形式的文本。如:词语出现频率统计、验证字符串是否符合邮箱格式、屏蔽一篇帖子中的限制性词语等。

定义正则表达式

/规则/修饰符

正则表达式规则

规则 含义
字母和数字 自身
[…] ⼀个字符集合。匹配⽅括号的中任意字符。你可以使⽤破折号(-)来指定⼀个字符范围。对于点(.)和星号(*)这样的特殊符号在⼀个字符集中没有特殊的意义。
[^…] ⼀个反向字符集。
{n, m} n 和 m 都是正整数。匹配前⾯的字符⾄少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。
{n} n是⼀个正整数,匹配了前⾯⼀个字符刚好发⽣了n次。
? 匹配前⾯⼀个字符0次或者1 次,和{0,1}有相同的效果。
+ 匹配前⾯⼀个字符1 次或者多次,和{1,}有相同的效果。
* 匹配前⼀个字符0次或者是多次。
^ 匹配输⼊的开始。如果多⾏标示被设置为true,同时匹配换⾏后紧跟的字符。
$ 匹配输⼊的结束,如果多⾏标示被设置为true,同时会匹配换⾏前紧跟的字符。

正则表达式修饰符

修饰符 含义
i 不区分大小写搜索
g 全局搜索
m 多行搜索

正则表达式中的转义字符

正则表达式中的所有字母和数字都是按照字面含义进行匹配的。javascript正则表达式语法也支持非字母的字符匹配,这些字符通过反斜线(\)作为前缀进行转义。

字符 匹配
\0 匹配NULL字符,不要在这后面跟其他小数
\t 匹配一个水平制表符
\n 匹配一个换行符
\v 匹配一个垂直制表符
\r 匹配一个回车符
\f 匹配一个换页符
\xhh 匹配带有两位小数代码(hh)的字符
\uhhhh 匹配带有四位⼩数代码(hh)的字符
\cX 当X是处于A到Z之间的字符的时候,匹配字符串中的⼀个控制符。例如, /\cM/ 匹配字符串中的 control-M (U+000D)。
. (小数点)匹配除了换行符(\n)之外的任何单个字符
\w 匹配⼀个单字字符(字⺟、数字或者下划线)。等价于[A-Za-z0-9_]。
\W 匹配⼀个⾮单字字符。等价于[^A-Za-z0-9_]。
\s 匹配⼀个空⽩字符,包括空格、制表符、换⻚符和换⾏符。
\S 匹配⼀个⾮空⽩字符。
\d 匹配⼀个数字。等价于[0-9]。
\D 匹配⼀个⾮数字字符。等价于[^0-9]。
[\b] 匹配⼀个退格. (不要和\b混淆了)
\b 匹配⼀个词的边界。⼀个词的边界就是⼀个词不被另外⼀个词跟随的位置或者不是另⼀个词汇字符前边的位置。
\B 匹配⼀个⾮单词边界。
x(?=y) 匹配“x”仅仅当“x”后⾯跟着“y”。这种叫做正向肯定查找。
x(?!y) 匹配“x”仅仅当“x”后⾯不跟着“y”,这个叫做正向否定查找。

javascript中的正则表达式

创建正则表达式

1.字面量方式

var expression = pattern/attributes
  • pattern参数:被称为模式,可以是任何简单或复杂的正则表达式,包括字符类、限定符、分组、向前查找以及反响引用等
  • attributes参数:被称为修饰符,用于表明正则表达式的行为

2.创建对象方式

javascript可以通过引用类型 RegExp 创建正则表达式对象。

var expression = new RegExp( pattern, attributes );

RegExp对象的属性

属性名 说明
global (只读) RegExp 对象是否具有 g 修饰符
ignoreCase (只读) RegExp 对象是否具有 i 修饰符
multiline (只读) RegExp 对象是否具有 m 修饰符
lastIndex ⽤于设置/获取下次匹配的起始位置
source (只读)返回模式匹配所使⽤的⽂本

RegExp对象的方法

方法名 说明
compile() 编译/重新编译正则表达式,将 pattern 转换为内部格式,加快执⾏速度
exec() 检索字符串中指定的值。返回找到的值,并确定其位置;影响lastIndex 属性的值
test() 检索字符串中指定的值。返回 true 或 false;影响 lastIndex 属性的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
TODO exec() 方法,返回匹配的值,以及匹配的位置
TODO * 返回的位置,与是否全局搜索无关,返回第一次匹配的位置
TODO * 如果没有匹配到,返回 null
TODO test() 方法,返回 truefalse
*/
var reg = /abc/;
var str = 'abcdefgabcdefg';
console.log(reg.exec(str)); // [ 'abc', index: 0, input: 'abcdefgabcdefg' ]
console.log(reg.test(str)); // true

reg = /abc/g;
console.log(reg.exec(str)); // [ 'abc', index: 0, input: 'abcdefgabcdefg' ]
str = 'dddd';
console.log(reg.exec(str)); // null

字符串的模式匹配

String对象提供了如下几种方法,用于匹配正则表达式

替换字符串replace()

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

语法

stringObject.replace(regexp/substr,replacement)

参数

  • regexp/substr:必需。规定子字符串或要替换的模式的 RegExp 对象。
  • replacement:必需。一个字符串值。规定了替换文本或生成替换文本的函数。

返回值
一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。

1
2
3
4
5
6
7
8
/*
TODO replace返回替换后的字符串
TODO 原字符串不变
*/
var str = 'hello world';
var reg = /o/g;
console.log(str.replace(reg,'e')); // helle werld
console.log(str); // hello world

匹配字符串match()

match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

语法

stringObject.match(searchvalue)
stringObject.match(regexp)

参数

  • searchvalue:必需。规定要检索的字符串值。
  • regexp:必需。规定要匹配的模式的 RegExp 对象。如果该参数不是 RegExp 对象,则需要首先把它传递给 RegExp 构造函数,将其转换为 RegExp 对象。

返回值
存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
TODO match 返回匹配到的值的数组
TODO 原字符串不变
TODO 没有匹配,返回 null
*/
var str = 'hello world';
var reg1 = /o/;
var reg2 = /o/g;
var reg3 = /q/;
console.log(str.match(reg1)); // [ 'o', index: 4, input: 'hello world' ]
console.log(str.match(reg2)); // [ 'o', 'o' ]
console.log(str.match(reg3)); // null
console.log(str); // hello world

查找字符串search()

search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。

语法

stringObject.search(regexp)

参数

  • regexp:该参数可以是需要在 stringObject 中检索的子串,也可以是需要检索的 RegExp 对象。

返回值
stringObject 中第一个与 regexp 相匹配的子串的起始位置。
注释:如果没有找到任何匹配的子串,则返回 -1。

说明
search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。

1
2
3
4
5
6
7
8
/*
TODO search方法返回第一次匹配到的索引
TODO 原字符串不变
*/
var str = 'hello world';
var reg1 = /o/g;
console.log(str.search(reg1)); // 4
console.log(str); // hello world
-------------本文结束感谢您的阅读-------------
Fork me on GitHub