在涉及对一个字符串进行格式验证,比如验证它是否是有效的邮箱格式,虽然可以分离提取字符串@
前后的字符来判断,但是那样显然很麻烦,所以我们可以使用正则表达式来对字符串进行匹配,在js中通过RegExp类型来支持正则表达式
常见的应用如下:
正则表达式的格式很简单,如下:
/abc/i;
这段正则表达式可以匹配包含
'abc'
或者ABC
的字符串等,被/.../
包裹的内容是正则表达式,/.../
后面的是标志,每一个正则表达式都可以带有1个或者多个标志,标志i
模式下不区分大小写
正则表达式中的元字符可以匹配位置或字符串中的某个字符,通过搭配可以更高效的写出正则表达式
匹配位置的元字符只有三个^
、$
和\b
:
元字符 | 作用 |
---|---|
^ |
用于匹配行的开始位置 |
$ |
用于匹配行的末尾位置 |
\b |
用于匹配单词的开始或者结尾 ,字符串中每一个空格分隔就算一个单词,如abc efg 就算两个单词 |
\B |
用于匹配不处于单词的开头或者结尾 |
//匹配abc开头的字符串
var str1 = /^abc/
//匹配abc结尾的字符串
var str2 = /abc$/
//匹配只有'abc'这3个字符组成的字符串
var str3 = /^abc$/
//匹配字符串中单词开头为'abc'的字符串
var str4 = /\babc/
//匹配字符串中单词结尾为'abc'的字符串
var str5 = /abc\b/
//匹配字符串中单词开头不为‘abc’的字符串
var str6 = /\Babc/
//匹配字符串中单词结尾不为‘abc’的字符串
var str7 = /abc\B/
\b会对空格隔开字符串进行匹配,但是匹配到有效后就会停止,使用标志
g
可以不停止匹配对全局进行匹配直到匹配完毕,\b
匹配到字符后可以配合replace()
将单词替换
匹配字符的元字符:
元字符 | 作用 |
---|---|
[] |
包含,如:[abc] 匹配其中任何一个字符(a 、b 、c )即满足条件 |
[^] |
反包含,如:[^abc] ,不匹配其中任何一个字符(a 、b 、c )即满足条件 |
\w |
匹配单个字符(数字、字母、下划线),等价于[0-9a-zA-Z\_] |
\W |
匹配单个字符(数字、字母、下划线除外),等价于[^0-9a-zA-Z\_] |
\d |
匹配单个数字字符,等价于[0-9] |
\D |
匹配单个非数字字符,等价于[^0-9] |
\s |
匹配单个空白字符(空格、Tab字符、回车和换行) |
`\S | 匹配单个非空白字符(非空格、Tab字符、回车和换行) |
. |
匹配单个除回车和换行符之外的所有字符(可以匹配中文) |
| |
匹配左右条件中的一个即满足条件,如:x|y 匹配x 或y |
限定符可以对匹配的上一项条件重复执行指定的次数
贪婪限定符 | 惰性限定符 | 作用 |
---|---|---|
* |
*? |
匹配0次或多次 |
+ |
+? |
匹配1次或多次 |
? |
?? |
匹配0次或1次 |
{n} |
{n}? |
匹配n次 |
{n,} |
{n,}? |
最少匹配n次 |
{n,m} |
{n,m}? |
最少匹配n次,最多匹配m次 |
var str = /abc*/
var str1 = /abc*?/
如果匹配的字符串是
'abcccccabccccancccabccabc'
贪婪匹配的结果会是
abccccc
,而惰性匹配的结果会是ab
,因为*最少匹配0次
//通过字面量创建正则表达式
var re1 = /ABC\-001/;
//通过RegExp对象实例化一个正则表达式
var re2 = new RegExp('ABC\\-001');
RegExp实例化的表达式参数是字符串,需要转义一下
这两种创建方式的结果并没有区别,写法是一样的
var re = /^\d{3}\-\d{3,8}$/;
re.test('010-12345'); // true
re.test('010-1234x'); // false
re.test('010 12345'); // false
RegExp对象的
test()
方法用于测试给定的字符串是否符合条件
'a,b;; c d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']
通过正则表达式还可以比固定字符串更灵活的分割字符串
规则中包含空格、
,
和;
的任意一个通过匹配开启一次分割,在+
的贪婪匹配下还可以过滤掉重复的分割符号(#^.^#)
用()
包含的正则表达式,在使用exec()ss
匹配的时候会返回一个数组:
var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null
exec()
在匹配成功时,返回的Array
中,第一个元素是匹配到的整个字符串,后面的元素依次为分组中匹配的字符串
exec()
在匹配失败时,会返回null
'0123.123456100'.replace(/^[0]*([1-9]\d*\.\d{0,4})\d*\.*$/,'$1')
([1-9]\d*\.\d{0,4})
匹配的是正整数开头,且有效小数位数为4位的数值,也是我们需要的效果,在通过/^[0]*
和\d*\.*$/
保证整个字符串都会匹配有效,最后替换字符串中的$1表示第一个分组(括号)中的内容
g
全局匹配,表示不会在发现第一个匹配项就停止
i
表示匹配不区分大小写
m
表示多行模式,多行模式,/^
和$/
匹配变成每行的行首与行尾
global,bool
类型,全局模式
ignoreCase,bool
类型,不区分大小写模式
multline,bool
类型,多行模式
var re1 = new RegExp('ABC\\-001','i')
var re2 = new RegExp('ABC\\-001','ig')
另外两个属性:
int
类型,表示搜索下一段匹配项字符串的位置,0开始[{(\$|)?*+.}]
,元字符必须转义,不然不会被识别*
和?
来说就是匹配0次,对于{n,m}?
来说等于{n}