js正则表达式

正则表达式(regular expression)是一个描述字符模式的对象。javascript的RegExp类表示正则表达式,string和RegExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本检索与替换功能。javascript的正则表达式,是perl5的正则表达式语法的大型子集。

javascript的正则表达式用RegExp表示,可以使用RegExp()构造函数来创建RegExp对象,不过RegExp对象更多是通过一种特殊的的直接量语法来创建。就像通过引号包裹字符的方式来定义字符串直接量一样,正则表达式直接量定义为包含在一对斜杠(/)之间的字符,例如

  var pattern = /s$/;

运行这段代码创建一个新的RegExp对象,并将它赋值给pattern。用构造函数也可以定义与之等价的正则表达式

var pattern = RegExp("s$");

1. 字符类

[...]   表示方括号内的任意字符
[^...]  表示不在方括号内的任意字符
.       除换行符和其他Unicode行终止符之外的任意字符
w      任何ASCII字符组成的单词,等价于[a-zA-Z0-9]
W      任何不是ASCII字符组成的单词,等价于[^a-zA-Z0-9]
s      任何Unicode空白符
S      任何非Unicode空白符
d      任何ASCII数字,等价于[0-9]
D      任何非ASCII数字,等价于[^0-9]
[]    退格直接量

2. 重复

{n,m}     匹配前一项至少n次,但不能超过m次
{n,}      匹配前一项n次或更多次
{n}       精确匹配前一项n次
?         匹配前一项0次或者1次,等价于{0,1}
+         匹配前一项1次或更多次,等价于{1,}
*         匹配前一项0次或更多次,等价于{0,}

3. 正则表达式的选择,分组和引用字符

|          选择,匹配的是该符号左边的子表达式或右边的子表达式
(...)      组合,将几项组合为一个单元,这个单元可以通过“*”,“+”,“?”,“|”等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供以后的引用使用
(?:...)    只组合,把项组合到一个单元,但不记忆与该项相匹配的字符

         和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也有可能是潜嵌套的),组索引是从左到右的左括号数,“(?:”形式的分组不编码

4. 正则表达式中的锚字符

^       匹配字符串的开头,在多行检索中,匹配一行的开头
$       匹配字符串的结尾,在多行检索中,匹配一行的结尾
      匹配一个单词的边界
B      匹配非单词的边界
(?=p)   零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p)   零宽负向先行断言,要求接下来的字符不与p匹配

5. 正则表达式的修饰符

i     执行不区分大小写的匹配  
g     执行一个全局匹配,简言之,即找到所有的匹配,而不是在找到第一个之后就停止
m     多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束

6. 正则表达式用于模式匹配的string方法

  string支持4种正则表达式的方法。

  1. search():他的参数是一个正则表达式,返回第一个与之匹配的字符串起始位置,如果找不到匹配的字符串,则返回-1;如果search()的参数不是正则表达式,则会首先调用Regexp的构造函数,将它转换为正则表达式,search()不支持全局检索,因为他忽略正则表达式修饰符g。

    例:’javascript‘.search(/script/i);

  2. replace(): 用以执行检索和替换操作其第一个参数是正则表达式,第二个参数是要进行替换的字符串。如果正则表达式设置了修饰符g,则进行全局检索并替换,如果不设置g,则只替换查找到的第一项。如果replace()的第1个参数是字符串而不是正则表达式,则replace()将直接搜索这个字符串,而不是想serrach()一样,首先通过RegExp(),将它转换为正则表达式。

    例:var text = ’php css html javascript‘;

      text.replace(/javascript/gi,'JavaScript');   //将text中的javascript替换为JavaScript。

  3. match(): 是最常用的string正则表达式方法。他的唯一参数是一个正则表达式。返回的是一个有匹配结果组成的数组。如果设置了修饰符g,则该方法返回的数组中包含字符串中的所有匹配结果。

    例:"1 plus 2 plus 3".match(/d+/g);  // 返回['1','2','3']

  如果没有修饰符g,match()不会进行全局检索,他之检索第一个匹配,这时也返回一个数组,在这种情况下,数组的第一个元素就是匹配的字符串。余下的元素是正则表达式中,用圆括号括起来的子表达式的匹配的子字符串。此时match()方法和RegExp的exec()方法一样。

  4. split(): 该方法将调用他的字符串拆分一个子串组成的数组,使用的分隔符是split()的参数。split()方法的参数也可以时一个正则表达式。

    例:"abc,def,ghj".split(',');   // 返回['abc','def','ghj']

7 RegExp对象

  RegExp()构造函数带有两个字符串参数,其中第二个是可选的,RegExp()用以创建新的RegExp对象。第一个参数包含正则表达式的主体部分,也就是正则表达式中直接量中两条斜线之间的文本。不论是直接量还是正则表达式的,都是用’‘作为字符串转义字符的前缀。第二个参数是正则表达式的修饰符,只能传入g,i,m或他们的组合。

  例:var zipcode = RegExp("\d{5}","g");

  RegExp的属性

    1. source:包含正则表达式的文本

    2. global:布尔值,说明正则表达式是否带有修饰符g

    3. ignoreCase:布尔值,说明是否带有修饰符i

    4. multiLine:布尔值,说明是否带有修饰符m

    5. lastIndex:可读写的整数,如果匹配模式带有修饰符g,这个属性存储 在字符串中下一次检索的开始位置,这个属性会被exec()和test()方法用到

  RegExp方法

    1. exec()  和match()方法没有修饰符g一样

    2. test() 他的参数是一个字符串,用test()对某个字符串进行检测,如果包含正则表达式的一个匹配结果,则返回true。

原文地址:https://www.cnblogs.com/huntaheart/p/3560129.html