正则表达式
正则表达式是一种用来匹配字符串的强有力武器,他的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,就认为他“匹配”,否则,该字符串就是不合法的。因为正则表达式也是用字符串表示的,所以,首先一要了解如何用字符串来描述字符。
匹配定长字符
在正则表达式中,如果直接给出字符,就是精确匹配:
- 用
\d
可以匹配一个数字 \w
可以匹配一个字母或者数字.
可以匹配任意字符\s
可以匹配一个空格(也包括Tab等空白符)
所以:
00\d
可以匹配到007
,但是无法匹配到00A
;\d\d\d
可以匹配到010
;\w\w
可以匹配到js、e7
;js.
可以匹配到jsp,js1,js!
等。
匹配变长字符
要匹配变长的字符,在正则表达式中:
- 用
*
表示任意个字符(包括0个) - 用
+
表示至少一个字符 - 用
?
表示0个或一个字符 - 用{n}表示n个字符
- 用{n,m}表示n–m个字符
举个例子:\d{3}\s+d{3,8}
,从左到右解读如下:
\d{3}
表示匹配3个数字。\s
可以匹配一个空格(也包括Tab等空白符),所以\s+
表示至少有一个空格,例如匹配,\t\t
等\d{3,8}
表示3-8个数字,例如1234567
综上所述,上面的正则表达式可以用来匹配以任意空格隔开的带区号的电话号码。例如020 1234567
。
如果想匹配010-12345
这样的号码呢?由于'-'
是特殊字符,在正则表达式中,要用\
转义,所以上面的正则式\d{3}\-\d{3,8}
。
进阶使用
- 可以使用
[]
来表示范围。 - 可以使用
A|B
来匹配A或B。(J|j)ava(S|s)cript
可以匹配到javascript
、Javascript
、JavaScript
、javaScript
。 ^
表示行的开头,^\d
表示必须以数字开头。$
表示行的结束,\d$
表示必须以数字结束。^js$
只能匹配到js
。
举个例子:^[a-zA-Z\_\$][0-9a-zA-Z\_\$]*
可以匹配由字母或下划线、$
开头,后接任意个由一个数字、字幕或者下划线、$
组成的字符串,也就是Javascript允许的变量名。
^[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}
更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
我和同学测试发现廖老师写的这里有个错误,原文是[a-zA-Z\_\$][0-9a-zA-Z\_\$]*
可以匹配由字母或下划线、$
开头,后接任意个由一个数字、字幕或者下划线、$
组成的字符串,也就是Javascript允许的变量名。但事实上,漏写了一个^
,表示第一个字符不能为数字,只能是字符下划线和$
。
RegExp
javascript有2种方式创建一个正则表达式:
- 直接通过
/正则表达式/
写出来 - 通过
new RegExp('正则表达式')
创建一个RegExp对象
这两种写法是一样的:
1 | var re1 = /ABC\-123/; |
如果使用第二种写法,因为字符串的转义问题,所以两个\\
实际上是一个\
。
如何查看字符串是否匹配,拿[a-zA-Z\_\$][0-9a-zA-Z\_\$]*
为例:
1 | var re = /^[a-zA-Z\_\$][0-9a-zA-Z\_\$]*/ |
切割字符串
用正则表达式切割字符串比用固定的字符更灵活,正常的切割如下:
1 | 'a b c'.split(' '); // ['a', 'b', '', '', 'c'] |
使用正则
1 | 'a b c'.split(/\s+/); // ['a', 'b', 'c'] |
分组
除了简单的判断是否匹配外,正则表达式还有提取字串的强大功能。用()
表示的就是要提取的分组(group)。比如:
^(\d{3})-(\d{3,8})$
分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:
1 | var re = /^(\d{3})-(\d{3,8})$/; |
如果正则表达式中定义了组,就可以在RegExp
对象上用exec()
方法提取出子串来。
exec()
方法在匹配成功后,会返回一个Array
,第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串。
exec()
方法在匹配失败时返回null
。
正则表达式标志
标志 | 描述 |
---|---|
g |
全局搜索。 |
i | 不区分大小写搜索。 |
m | 多行搜索。 |
y | 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。 |
包含一个标志的正则表达式,使用这个表达式:
1 | var re = /pattern/flags; |
或者
1 | var re = new RegExp("pattern", "flags"); |