正则表达式
1什么是正则表达式,创建正则的两种方法
正则表达式是一个描述字符模式的一个对象,正则表达式用RegExp对象表示。
正则表单式创建方式有两种:1、直接量 2、使用RegExp来创建正则对象。 用
var person=/\w/g;
var person1=new RegExp("\\w")
一般如果正则表达式是变量的,通常使用第二种方式,第一个参数是正则表达式,第二个是模式匹配符包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。
var str='mm'+1;
var reg=new RegExp(str,'g');
reg.test('mm1');
2.正则表达式的元字符和量词
元字符 | 描述 |
. | 除了换行符和其他unicode之外的所有字符 |
\w | 等价于[a-zA-Z0-9] |
\W | 等价于[^a-zA-z0-9] |
[....] | 在方括号内的任意字符 |
[^...] | 不在方括号内的任意字符 |
\s | 任何空白字符 |
\S | 任何非unicode字符外的字符 |
\d | 等价于[0-9] |
\D | 等价于[^0-9] |
? | 匹配前面的0次或者1次,等价于{0,1} |
+ | 匹配前面的一次或者多次,等价于{1,} |
* | 匹配前面的多次或者0次,等价于{0,} |
{n,m} | 匹配前面的n次到m次 |
{n} | 匹配n次 |
{n,} | 匹配前面的n次或者更多次 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
\b | 匹配字符串的边界 |
\B | 匹配非边界 |
? | 在量词后面加一个?表示非贪婪匹配,尽可能少的匹配 |
在正则中还有许多标点符号有特殊的意义,他们是:
^ $ . * + ? = ! : | \ / () [] {}
如果想在正则表达式中使用他们的直接量,那么要用\斜杠进行转义,例如 var reg=/\\/g 这个匹配的是一个‘\';
2.2 贪婪与非贪婪模式
贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。
属于贪婪模式的量词,也叫做匹配优先量词,包括:
“{m,n}”、“{m,}”、“?”、“*”和“+”。
在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括:
“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。
从正则语法的角度来讲,被匹配优先量词修饰的子表达式使用的就是贪婪模式,如“(Expression)+”;被忽略优先量词修饰的子表达式使用的就是非贪婪模式,如“(Expression)+?”。
2.3 选择和分组引用和正向匹配
字符 |
含义 |
| |
匹配该字符串左侧子表达式或者右侧子表达式 |
() |
将几个项组合成一个单元,这个单元可以用*+?修饰,并且记住这个单元,以供后面引用 |
(?:....) |
只组合但是不记忆这个分组 |
\n |
和第n个分组第一次匹配的字符相匹配,分组是圆括号中的子表达式,从左到右的第几个表达式。 |
(?=p) |
要求接下来的字符都于p匹配 |
(?!p) |
要求接下来的字符都不能于p匹配。 |
3 正则的方法
3.1 exec() exec返回一个数组,数组的第一个元素是整体匹配到的字符,第二个是子表达式相匹配的文本。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。
3.2 test() 返回一个布尔值,true或者false 如果加了g,那么没操作一次,lastIndex就往后移动;
4 用以匹配正则的字符串的方法
4.1 search()
serach的参数是一个正则的表达式,返回第一个与之匹配的子串的位置,如果找不到返回-1,如果给的参数不是正则,那么会使用RegExp()初始化成一个正则表达式.
alert("javascript".search(/script/g));//返回4 alert("javascript".search(/css/g));//返回-1
4.2 replace()
replace的第一个参数是正则表达式,或者普通的字符,第二个是要替换成的字符,或者fuction,或者$n 如果不加g,查找到第一个匹配的字符替换后就不进行替换了,否则将替换所有匹配的字符。
"javascript,css,html".replace(/javascript/g,"java");//java,css,html
"css,c#,c++,html".replace(/(css),c#/,"$1"); //css,c++,html
下面replace的第二个参数是一个方法,这个方法有三个参数,第一个是要替换的字符串,第二个是要替换的字符串的索引值,第三个是原有的字符串,这个方法必须有return返回值,用返回值来替换要替换的字符串,replace方法不会改变原有字符串;
4.3 match()
match()里面是一个正则表达式,如果加上g,则全局查找,返回的是匹配到的数组,如果不加g,找到第一个就不继续查找,返回的是一个数组,数组的第一个元素是匹配到的整体字符串,第二个元素是子元素。
var str='eng1eem2mfefn3'; str.match(/\w(\d)/) ["g1", "1"] var str='eng1eem2mfefn3'; str.match(/\w(\d)/g) ["g1", "m2", "n3"]
4.4 split()
split参数可以是正则,用以将字符串分割成一个数组。