正则表达式
简介
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
使用正则表达式一般用来:
- 检测字符串的模式,是否包含需要的内容。做数据验证
- 可以将正则表达式匹配出的字符串替换成其他的字符。
- 提取字符串。做网页爬虫时需要用正则匹配标签内的信息。
正则表达式如果只有精确的匹配作用就没有那么大了.一般正则用来进行模糊匹配.
创建方法
正则表达式支持两种创建方法:
- 使用字面量创建。
var reg = /hello world/;
2.使用构造方法创建
var reg = new RegExp(/hello world/);
可接受的参数和属性
正则的参数一般跟在 / 后面.
例如:
var reg1 = /today/img;
//这里面的参数g意思是全局匹配,会一直将整个字符串全部进行匹配。
下面是一些常见的参数:
参数 | 作用 |
---|---|
g | 执行全局匹配,如果没有这个参数,正则会在匹配一次以后就会停止。 |
i | 匹配时将不区分大小写。 |
m | 将识别一些换行符,会将一行的开头结尾进行匹配。 |
s | 激活正则对象的dotAll属性(true),可以让 .匹配到任意字符。 |
y | 正则对象会以自己的lastIndex属性中记录的下标开始匹配 |
正则对象属性:
属性 | 描述 |
---|---|
constructor | 返回正则表达式原型的函数 |
global | 值为Boolean型,如果设置了参数g,就为true |
ignoreCase | 如果了设置了i参数,这个值为true,忽略大小写 |
lastIndex | 记录了下次匹配的其实位置配合y参数使用 |
multiline | 判断是否设置了m参数,是否进行多行匹配 |
source | 保存着正则对象的匹配标准 |
/today/g
dotAll: false
flags: "g"
global: true
ignoreCase: false
lastIndex: 0
multiline: false
source: "today"
sticky: false
unicode: false
__proto__: Objec
正则匹配的规则
范围表示:
规则 | 作用 |
---|---|
^ | 表示以什么开头.如 /^abc/ 就代表以abc开头的字符匹配规则 |
$ | 表示以什么结尾.如 /abc$/ 就代表以abc结尾的字符匹配规则 |
[abc] | 匹配括号内的任意一个字符 |
[0-9] | 简写形式,匹配0到9之间的任意一个数字 |
[a-z] | 匹配小写字母a到z之间的任意一个字母 |
[A-Z] | 匹配大写字母A-Z之间的任意一个大写的字母 |
[A-z] | 匹配从大写A到小写z之间任意一个字母 |
[any | any |any] | 符合中括号中任意一个字符 |
如果没有量词数量限制 [ ] 中括号就代表一个,就是只要匹配其中任意一个就算匹配成功
元字符(一种范围简写的形式)
元字符 | 描述 |
---|---|
\w | 匹配单词字符,范围包括0-9 、a-z、A-Z,下划线_字符 |
\W | 匹配非单词字符,与\w相反 |
\d | 匹配数字 |
\D | 匹配非数字的字符 |
\s | 匹配空的字符 |
\S | 匹配非空的字符 |
. | 匹配除了换行和行结束符的字符 |
\b | 匹配作为边界非完整的字符,从左往右 |
\B | 匹配非全边界一般作为结尾的字符,从右往左 |
\n | 查找换行符 |
var str = 'abduo $ # 12\na\tbcv 234_3\r@qq.com 010-343433'
console.log('\d', str.match(/\d/g));
console.log('\D', str.match(/\D/g));
console.log('\w', str.match(/\w/g));
console.log('\W', str.match(/\W/g));
console.log('\s', str.match(/\s/g));
console.log('\S', str.match(/\S/g));
console.log('.', str.match(/./g));
console.log('\.', str.match(/\./g));
console.log('a|b', str.match(/a|b/g));
// 关于\b 和 \B
var str="Visiv Runooob";
var patt1=/\Booob/gi;
var patt2=/\brun/gi;
// 打印结果为
ooob
Run
量词
量词 | 描述 |
---|---|
n+ | 出现0次或者出现1次 |
n* | 出现0次或者多次 |
n? | 出现0次或者一次 |
{n} | 出现了n次 |
{x,y} | 出现x到y次 |
?=n | 任何后面紧接着n的字符。匹配的是n前面的 |
?!n | 后面没有紧接着跟着n的字符 |
var reg1 = /a/;
var reg2 = /^a$/;
var reg3 = /^a*$/;
var reg4 = /^a+$/;
var reg5 = /^a?$/;
var reg5 = /^a{3}$/;
正则表达式对象常用的方法
exec:检测字符串中正则表达式的匹配。如果匹配到了值,就会返回匹配值(一个数组对象里面记录了一些匹配数据)。如果没有匹配到会返回null。
语法:RegExpObject.exec(string)
var str = 'hello world hello world';
var reg = /hello/g;
console.log(reg.exec(str));
console.log(reg.exec(str));
exec每次只执行一次,每次执行都会根据正则对象里面保存的lastIndex的值来进行下一次开始的位置。这个值不会因为更改字符串对象而改变。
test:检测一个字符串是否符合正则对象的规则
语法:RegExpObject.test(string)
var reg = /[abc]/;
var str = 'abc';
console.log(reg.test(str));//true
字符串关于正则的方法
search检索与正则表达式相匹配的值,返回找到的字符串的下标,没有找到会返回-1.。本身就有检索字符串的功能。
var str="Visit Runoob!";
var n=str.search("Runoob");
var n=str.search("/Runoob/");
//输出结果为6
match检索所有与正则表达式相匹配的值,返回由匹配值组成的数组。如果正则对象有g参数,会查找到多个值,否则只找到一次。一次时返回也是数组,里面包含了有关这次查找的信息。没有找到返回null。
var str = 'abcdefghjabcde';
str.match(/a*/);//只匹配一次
str.match(/a*/g);//会进行多次匹配
replace:第一个参数可以为正则对象或者字符串(匹配规则),第二个参数可以是字符串或者一个函数。将依据第一个匹配规则匹配到的字符替换成第二个参数的字符。如果第二个为函数,会将匹配到的字符作为参数传递进去。第二个参数必须得到一个值,函数需要在内部返回一个值。
用这个做过字符串转换驼峰法。该方法返回改变后的字符串,但是原字符串没有被改变。
var str = 'aabcefg';
var rel = str.replace(/a*/g, function (str) {
return str.toUpperCase();
});
console.log(rel);// AAbcefg
console.log(str);// aabcefg
表单input标签支持正则的属性
pattern:当给input添加该属性以后,表单在提交时会自动依据属性值进行匹配,如果不符合条件,会弹出浏览器自定义的警告信息。但是这个属性不是支持所有类型的input。目前来说适用于:text、search、url、telephone、email以及password。
书写格式:
pattern="/^1[3|4|5|7|8]\d{9}$/"
关于正则提取值$
上面的方法已经可以返回匹配到的值,但是还有一些特殊的提取正则的值,这些方法并不是正式的,不建议用到正式的产品中。
- 在replace方法中第二个参数如果是一个函数。$ 字符具有特定的含义。它代表从模式匹配得到的字符串将用于替换。
name = "Doe, John";
name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");
// John Doe
- 在test方法检测一个字符串时,此处的RegExp不能省略掉,否则会出现错误,且$的值只能找到第九位。
// 使用括号将正则分割成
var reg = /(\w+)@([\w|-]+)\.(\w+)(\.\w+)?/;
var str = '123123@qq.com';
if (reg2.test(str)) {
console.log(RegExp.$1);
console.log(RegExp.$2);
console.log(RegExp.$3);
}