RegExp
的构造函数创建了一个正则表达式对象,用模式来匹配文本。
有关正则表达式介绍,请阅读JavaScript指南中的正则表达式章节。
文字和构造符号是可能的:
/pattern/flags new RegExp(pattern [, flags])
pattern
flags
如果指定,标志可以具有以下值的任意组合:
g
i
m
y
有两种方法可以创建一个正则对象:字面量和构造函数。要表示字符串,字面量形式不使用引号,而传递给构造函数的参数使用引号。下面表达式创建相同的正则表达式:
/ab+c/i;
new RegExp('ab+c', 'i');
new RegExp(/ab+c/, 'i');
当表达式被赋值时,字面量形式提供正则表达式的编译(compilation)状态,当正则表达式保持为常量时使用字面量。例如当你在循环中使用字面量构造一个正则表达式时,正则表达式不会在每一次迭代中都被重新编译(recompiled)。
而正则表达式对象的构造函数,如 new RegExp('ab+c')
提供了正则表达式运行时编译(runtime compilation)。如果你知道正则表达式模式将会改变,或者你事先不知道什么模式,而是从另一个来源获取,如用户输入,这些情况都可以使用构造函数。
从ECMAScript 6开始,当第一个参数为正则表达式而第二个标志参数存在时,new RegExp(/ab+c/, 'i')不再抛出TypeError
(“当从其他正则表达式进行构造时不支持标志”)的异常,取而代之,将使用这些参数创建一个新的正则表达式。
当使用构造函数创造正则对象时,需要常规的字符转义规则(在前面加反斜杠 \)。比如,以下是等价的:
var re = new RegExp("\\w+");
var re = /\w+/;
字符类别(Character Classes) | |
---|---|
字符 | 含义 |
. |
(点号,小数点)匹配任意单个字符,但是换行符除外,包括: 需要注意的是, 例如, |
\d |
匹配基本拉丁字母表(basic Latin alphabet)中的一个数字字符。等价于 例如, |
\D |
匹配任意一个不是基本拉丁字母表中数字的字符。等价于 例如, |
\w |
匹配任意来自基本拉丁字母表中的字母数字字符,还包括下划线。等价于 例如, |
\W |
匹配任意不是基本拉丁字母表中单词(字母数字下划线)字符的字符。等价于 例如, |
\s |
匹配一个空白符,包括空格、制表符、换页符、换行符和其他 Unicode 空格。 等价于 例如 |
\S |
匹配一个非空白符。等价于 例如, |
\t |
匹配一个水平制表符(tab) |
\r |
匹配一个回车符(carriage return) |
\n |
匹配一个换行符(linefeed) |
\v |
匹配一个垂直制表符(vertical tab) |
\f |
匹配一个换页符(form-feed) |
[\b] |
匹配一个退格符(backspace)(不要与 \b 混淆) |
\0 |
匹配一个 NUL 字符。不要在此后面跟小数点。 |
\cX |
例如, |
\xhh |
匹配编码为 hh (两个十六进制数字)的字符。 |
\uhhhh |
匹配 Unicode 值为 hhhh (四个十六进制数字)的字符。 |
\ |
对于那些通常被认为字面意义的字符来说,表示下一个字符具有特殊用处,并且不会被按照字面意义解释。 例如 或 对于那些通常特殊对待的字符,表示下一个字符不具有特殊用途,会被按照字面意义解释。 例如,* 是一个特殊字符,表示匹配某个字符 0 或多次,如 |
字符集合(Character Sets) |
|
字符 | 含义 |
[xyz] |
一个字符集合,也叫字符组。匹配集合中的任意一个字符。你可以使用连字符'-'指定一个范围。 例如,[abcd] 等价于 [a-d],匹配"brisket"中的'b'和"chop"中的'c'。 |
[^xyz] |
一个反义或补充字符集,也叫反义字符组。也就是说,它匹配任意不在括号内的字符。你也可以通过使用连字符 '-' 指定一个范围内的字符。 例如, |
边界(Boundaries) | |
字符 | 含义 |
^ |
匹配输入/字符串的开始。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符后的开始处。 例如, |
$ |
匹配输入/字符串的结尾。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符的前的结尾处。 例如, |
\b |
匹配一个零宽单词边界(zero-width word boundary),如一个字母与一个空格之间。 (不要和 例如, |
\B |
匹配一个零宽非单词边界(zero-width non-word boundary),如两个字母之间或两个空格之间。 例如, |
分组(Grouping)与反向引用(back references) | |
字符 | 含义 |
(x) |
匹配 例如, 捕获组(Capturing groups)有性能惩罚。如果再次访问被匹配的子字符串,最好使用非捕获括号(non-capturing parentheses),见下面。 |
\n |
例如, |
(?:x) |
匹配 x 不会捕获匹配项。这被称为非捕获括号(non-capturing parentheses)。匹配项不能够从结果数组的元素 [1], ..., [n] 或已被定义的 RegExp 对象的属性 $1, ..., $9 再次访问到。 |
数量词(Quantifiers) | |
字符 | 含义 |
x* |
匹配前面的模式 x 0 或多次。 例如, |
x+ |
匹配前面的模式 x 1 或多次。等价于 例如, |
x*? x+? |
像上面的 * 和 + 一样匹配前面的模式 x,然而匹配是最小可能匹配。 例如, |
x? |
匹配前面的模式 x 0 或 1 次。 例如, 如果在数量词 在使用于向前断言(lookahead assertions)时,见该表格中 |
x(?=y) |
只有当 x 后面紧跟着 y 时,才匹配 x 。 例如,/Jack(?=Sprat)/ 只有在 'Jack' 后面紧跟着 'Sprat' 时,才会匹配它。/Jack(?=Sprat|Frost)/ 只有在 'Jack' 后面紧跟着 'Sprat' 或 'Frost' 时,才会匹配它。然而,'Sprat' 或 'Frost' 都不是匹配结果的一部分。 |
x(?!y) |
只有当 |
x|y |
匹配 例如, |
x{n} |
例如, |
x{n,} |
例如, |
x{n,m} |
例如, |
[\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]
RegExp
instances, see Properties of RegExp instances.
RegExp.prototype
RegExp.length
值为 2。
RegExp
instances, see Methods of RegExp instances.
RegExp
自身没有方法, 不过它会继承一些方法通过原型链
查看已废弃的RegExp属性
注意,RegExp
对象的几个属性既有完整的长属性名,也有对应的类 Perl 的短属性名。两个属性都有着同样的值。JavaScript 的正则语法就是基于 Perl 的。
RegExp.prototype.
constructor
RegExp.prototype.global
RegExp.prototype.ignoreCase
RegExp.prototype.lastIndex
RegExp.prototype.multiline
RegExp.prototype.source
RegExp.prototype.sticky
查看已废弃的RegExp方法
RegExp.prototype.exec()
RegExp.prototype.test()
RegExp.prototype.toSource()
Object.prototype.toSource
方法.
RegExp.prototype.toString()
Object.prototype.toString()
方法。
下例使用 replace
方法 (继承自 String
)去匹配姓名 first last 输出新的格式 last, first。脚本中使用 $1 和
$2
指明括号里先前的匹配.
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
print(newstr);
显示 "Smith, John".
var s = "Please yes\nmake my day!";
s.match(/yes.*day/);
// Returns null
s.match(/yes[^]*day/);
// Returns 'yes\nmake my day'
该例展示了,如何在正则表达式上使用 sticky 标志,用来匹配多行输入的单独行。
var text = "First line\nsecond line";
var regex = /(\S+) line\n?/y;
var match = regex.exec(text);
print(match[1]); // prints "First"
print(regex.lastIndex); // prints 11
var match2 = regex.exec(text);
print(match2[1]); // prints "Second"
print(regex.lastIndex); // prints "22"
var match3 = regex.exec(text);
print(match3 === null); // prints "true"
可以使用 try { … } catch { … }
来测试运行时(run-time)是否支持 sticky
标志。这种情况下,必须使用 eval(…)
表达式或 RegExp(regex-string, flags-string)
语法(这是由于 /regex/flags
表示法将会在编译时刻被处理,因此在 catch
语句块处理异常前就会抛出一个异常。例如:
var supports_sticky;
try { RegExp('','y'); supports_sticky = true; }
catch(e) { supports_sticky = false; }
alert(supports_sticky); // alerts "false" in Firefox 2, "true" in Firefox 3+
正如上面表格提到的,\w
或 \W
只会匹配基本的 ASCII 字符;如 'a' 到 'z'、 'A' 到 'Z'、 0 到 9 及 '_'。为了匹配其他语言中的字符,如西里尔(Cyrillic)或 希伯来语(Hebrew),要使用 \uhhhh
,"hhhh" 表示以十六进制表示的字符的 Unicode 值。下例展示了怎样从一个单词中分离出 Unicode 字符。
var text = "Образец text на русском языке";
var regex = /[\u0400-\u04FF]+/g;
var match = regex.exec(text);
print(match[1]); // prints "Образец"
print(regex.lastIndex); // prints "7"
var match2 = regex.exec(text);
print(match2[1]); // prints "на" [did not print "text"]
print(regex.lastIndex); // prints "15"
// and so on
这里有一个外部资源,用来获取 Unicode 中的不同区块范围:Regexp-unicode-block
var url = "http://xxx.domain.com";
print(/[^.]+/.exec(url)[0].substr(7)); // prints "xxx"