JavaScript 正则表达式


正则表达式是一种描述匹配模式的字符串。用来在一个字符串中查找、替换指定模式的子字符串。


元字符(Metacharacter)

元字符是有特殊含义的字符。元字符包含:?*+.^$()[]{}|\。除了元字符外的其它字符都匹配自己。

\字符是转义字符,会改变紧跟在它后面的字符的意义。如果要匹配元字符,需要在元字符前加上\

字符组(Character Class)

字符组是包含在中括号中的字符集合。字符组只匹配字符串中的一个字符。

字符组有下面2种:

  • 简单字符组,例如[abc]或[a-c],匹配a或b或c。[\u4e00-\u9fa5],匹配中文字符。
  • 否定(Negation)字符组,例如[^abc]或[^a-c],除去a、b、c以外的所有其它字符。

预定义的字符组,常用字符组的简写形式。

预定义字符组有下面几种:

  • .,匹配任何字符(不包含换行符)。
  • \d,数字,即[0-9]。
  • \D,非数字,即[^0-9]。
  • \s,空白字符,即[ \t\n\v\f\r]。
  • \S,非空白字符,即[^\s]。
  • \w,单词字符,即[a-zA-Z_0-9]。
  • \W,非单词字符,即[^\w]。

量词(Quantifier)

量词用于指定匹配出现的次数。

有下面几种量词:

  • x?,匹配0个或1个x。
  • x*,匹配0或多个x。
  • x+,匹配1或多个x。
  • x{n},匹配n个x。
  • x{n,},匹配至少n个x。
  • x{n,m},匹配至少n个x,但不超过m个x。

使用量词时默认是贪婪(greedy)匹配,如果在量词后面再加上?则表示使用惰性(reluctant)匹配。

捕获组(Capturing Group)

捕获组将多个字符当做一个单元看待。在多个字符前后加上括号(...)创建一个捕获组。

匹配的捕获组可以在后面使用,称为反向引用(backreference)。捕获组从左到右被编号。捕获组0表示整个字符串。反向引用使用\后跟捕获组编号来引用捕获组的值,例如\1。在替换字符串中使用$后跟捕获组编号来引用捕获组的值,例如$1

匹配边界(Boundary Matcher)

匹配边界指匹配开始和结束的位置。

有下面几种匹配边界:

  • ^,行的开始。
  • $,行的结束。
  • \b,单词边界。
  • \B,非单词边界。

创建正则表达式

有2种方式创建正则表达式:

  • 使用正则表达式字面量,/pattern/flags,例如:var re = /hsw+/i;
  • 使用正则表达式构造函数,new RegExp("pattern", "flags"),例如:var re = new RegExp("hsw+", "i");

其中正则表达式标志(flags)有下面几种:

  • i,忽略大小写。
  • g,全局匹配。找到所有匹配,而不是在第一个匹配后停止。
  • m,多行搜索。将字符串视为多行。^和$匹配字符串中的每一行。而不是整个字符串中的开始和结束。

匹配和查找

RegExp对象的test方法用来判断一个字符串是否匹配指定模式,返回true或false结果值。

String对象的search方法用来判断一个字符串是否匹配指定模式,返回匹配到的位置索引(未匹配则返回-1)。

RegExp对象的方法exec用来从一个字符串中查找匹配,返回一个数组,包含匹配到的字符串和所有的捕获组,未匹配到则返回null。

String对象的match方法用来从一个字符串中查找匹配,返回一个数组,包含所有匹配到的字符串,未匹配则返回null。

下面是匹配和查找的例子:

<!DOCTYPE html><html><body><pre>
<script type="text/javascript">
  var re = /(\da)bc/g;
  var test = re.test('A2abcd');
  var search = 'A2abcd'.search(re);

  var exec = re.exec('A2abcd3abcd');
  var match = 'A2abcd3abcd'.match(re);

  document.writeln("test result : " + test);      // true
  document.writeln("search result : " + search);  // 1
  document.writeln("exec result : " + exec);    // 3abc,3a
  document.writeln("exec match : " + match);    // 2abc,3abc
</script>
</pre></body></html>

替换

String对象的replace方法用来将字符串中的所有匹配指定模式的地方替换成指定的字符串。

在替换字符串中可以使用$后跟捕获组编号来引用捕获组的值,例如$1

下面是替换的例子:

<!DOCTYPE html><html><body><pre>
<script type="text/javascript">
  var re = /\dabc/g;
  var re2 = /(\da)(bc)/g;
  var replace = 'A2abcd3abc4'.replace(re, "*");
  var replace2 = 'A2abcd3abc4'.replace(re2, "$1 $2");

  document.writeln("replace : " + replace);   // A*d*4
  document.writeln("replace2 : " + replace2); // A2a bcd3a bc4
</script>
</pre></body></html>

拆分

String对象的split方法用来将指定模式作为分隔符拆分字符串,并将结果保存到数组中返回。

下面是拆分的例子:

<!DOCTYPE html><html><body><pre>
<script type="text/javascript">
  var re = /\dabc/g;
  var split = 'A2abcd3abc4'.split(re);

  document.writeln("split : " + split); // A,d,4
</script>
</pre></body></html>