RegExp

概述

创建一个正则表达式对象,用特定的模式匹配文本.

语法

RegExp(pattern [, flags])

/pattern/flags

参数

pattern
正则表达式的文本.
flags

该参数可以是下面几个值的任意组合:

g
全局匹配
i
忽略大小写
m
让开始和结束锚点(^和$)工作在多行模式(也就是,^和$可以匹配字符串中每一行的开始和结束(行是由\n或\r分割的),而不只是整个输入字符串的最开始和最末尾处)
y
sticky; matches only from the index indicated by the lastIndex property of this regular expression in the target string (and does not attempt to match from any later indexes). This allows the match-only-at-start capabilities of the character "^" to effectively be used at any location in a string by changing the value of the lastIndex property.

描述

当使用结构函数创造正则对象时,通常的字符转意规则(包括特殊字符包含字符串的\)是必要的。比如以下是等价的:

var re = new RegExp("\\w+");
var re = /\w+/;

注意,字面量声明的参数无需引号,而函数声明的参数则需要放在引号里,以下是等价的:

/ab+c/i;
new RegExp("ab+c", "i");

正则运算中的特殊匹配

Character Meaning
\

这个字符通常代表以字面量来对待,指定其后面的字符为字面量,而不当作字面上来解释。

比如 /b/ 匹配 字母"b", 如果是/\b/ 则代表匹配任何字符边界(空格等)

或者

特殊对待后面的字符,代表下一个字符是特殊的当作字面上来解释

比如,*匹配前字符出现0或多次,/a*/表示a出现0或多次。而如果匹配字符"*“本身,我们需要用到反斜线,如/a\*/匹配 "a*"

^

匹配输入的开始,如果multiline设为真,同时匹配换行后的字符。

比如:/^A/ 无法匹配 "an A",但是可以匹配 "An A"

$

匹配输入的结束。如果multiline设为真,同时匹配换行前的字符。

比如: /t$/不匹配 "eater"中的"t",但是匹配"eat"中的t

*

匹配前项0次或多次。

比如 /bo*/匹配

”A ghost booooed“ 中的"boooo"

"A bird warbled" 中的 "b"

"A goat grunted" 不匹配

+

匹配前项1次或多次。与 {1,}等价。

比如 /a+/ 匹配

"candy" 中的"a"

"caaaaaaaandy"中所有的 "a"

*?
+?

类似 * , + 的匹配前面的项,采用最小可能的匹配。

比如  /".*?"/   匹配 '"foo" "bar"'中的 '"foo"',而不采用?,匹配 '"foo" "bar"'。

?

匹配前项 0-1次。

举例:

/e?le?/ 匹配 "angel" 中的 'el' 以及 "angle." 中的 'le'

如果?用在量词(*+?, {})后,表示量词的非贪婪匹配(匹配最小次数),与之相反的是贪婪匹配(匹配最大次数)

同时问号可使用前置语法,比如 (?=), (?!),和 (?:) ,详情见此表下方。

.

(句号)匹配任意单独字符,换行符除外:\n \r \u2028 or \u2029

[\s\S] 可匹配任意字符,包含换行符。

例子: /.n/ 匹配  "nay, an apple is on the tree" 中的'an' 和'on',但没有 'nay'.

(x)

匹配x并记住这个匹配,叫做捕获括号。

比如,/(foo)/ 匹配并记住 "foo bar." 中的 'foo',匹配的字符串可以在结果数组中通过[1],...,[n]调用,或者从定义过的RegExp对象的属性 $1,...,$9 调用。

捕获括号会损失性能,如果你不需要调用返回数组,则尽可能使用非捕获括号。

(?:x)

匹配x并且不保存匹配。叫做非捕获括号。匹配字符串无法被重新调用。

x(?=y)

匹配x当y位于其后方。

例子: /Jack(?=Sprat)/ 匹配 'Jack' 仅在 'Sprat' 之后。

 /Jack(?=Sprat|Frost)/ 匹配 'Jack'仅在 'Sprat' 或 'Frost'之后。 'Sprat' 和 'Frost' 都不包含在返回结果中。

x(?!y)

匹配x当y不位于其之后。

例子: /\d+(?!\.)/ 匹配不在小数点之后的数字。

/\d+(?!\.)/.exec("3.141") 匹配 141 而不是 3.141.

x|y

匹配x或y

例子: /green|red/ 匹配 "green apple" 中的 'green' 和 "red apple." 中的 'red'

{n}

当n是正整数的时候,匹配前一项出现的次数。

例子: /a{2}/ 不匹配 "candy,"中的 'a' ,匹配"caandy,"中 'aa',匹配"caaandy."中前两个a

{n,}

当n是正整数的时候,匹配前一项至少出现的次数。

例子: /a{2,}/ 不匹配"candy"中的'a',匹配 "caandy" 和 "caaaaaaandy."中所有的a

{n,m}

n,m为正整数。匹配前一项出现次数n-m之间

例子: /a{1,3}/ 不匹配 "cndy",  匹配"candy,"中的a,匹配"caandy,"的前两个a, 匹配"caaaaaaandy"的前三个a

注意: "caaaaaaandy" 匹配 "aaa",不论这里有多少a

[xyz]

字符集。匹配中括号中的任意字符。可以通过连字符来指定范围。

例子:[abcd] 等同于 [a-d]. 匹配"brisket"中的b 和 "chop"中的c.

[^xyz]

反字符集。匹配任意字符除中括号里的字符。同样可以通过连字符来指定范围。

例子:[^abc] 等同于 [^a-c]. 匹配"bacon" 中的 o,匹配"chop."中的h

[\b] 匹配退格键(backspace). (注意和 \b 是不同的)
\b

匹配无宽度字符边界,比如一个字母或一个空格之间(注意和[\b]是不同的)

比如 /\bno/ 匹配"at noon"的 no; /ly\b/ 匹配"possibly yesterday."中的ly

\B

匹配无宽度非字符边界,比如两个字母或两个空格之间

比如  /\Bon/ 匹配 "at noon" 中的on, /ye\B/ 匹配 "possibly yesterday."中的ye

\cX

X为A - Z . 匹配控制字符

比如, /\cM/ 匹配字符串中的 control-M.

\d

匹配数字字符基于拉丁字母表,等价[0-9].

注意:firefox2 及以下,匹配 任何字母表的数字。(bug 378738)

比如, /\d/ or /[0-9]/ "B2 is the suite number."中的2

\D

匹配任何非数字字符,基于拉丁字母,等价[^0-9].

注意:firefox2 及以下,匹配 任何字母表的数字。 (bug 378738)

例子: /\D/ 或 /[^0-9]/ "B2 is the suite number." 匹配B

\f 匹配换页符 (form-feed).
\n 匹配换行符 (linefeed).
\r 匹配回车 (carriage return).
\s

匹配单个空格字符,包括space, tab, form feed, line feed 以及其他unicode spaces,等价于[ \t\r\n].

例子: /\s\w*/  匹配 "foo bar." 中的bar

\S

匹配非空格字符,等价于 [^ \t\r\n].

例子:  /\S\w*/ 匹配 "foo bar." 中的foo

\t 匹配 tab.
\v 匹配垂直tab (vertical tab).
\w

匹配基础拉丁字母表的所有字符,包括下划线(underscore.) ,等价于 [A-Za-z0-9_].

例如, /\w/ 匹配"apple," 中的 a ,"$5.28," 匹配 5,"3D."匹配3

\W

匹配非基础拉丁字母表的字符,等价于[^A-Za-z0-9_].

例如, /\W/ or /[^A-Za-z0-9_]/ 匹配 "50%." 中的 '%'

\n

当n是正整数时, 匹配第n次括号里的引用。

Where n is a positive integer. A back reference to the last substring matching the n parenthetical in the regular expression (counting left parentheses).

比如, /apple(,)\sorange\1/ 匹配 'apple, orange,'  在 "apple, orange, cherry, peach." 中,阅读以下查看更复杂的案例。

\0 匹配 NUL 字符. 不要把它放在另一个数字之后
\xhh

匹配字符通过hh编码(二进制数字)

Matches the character with the code hh (two hexadecimal digits)

\uhhhh

匹配字符通过hh编码(四进制数字)

Matches the character with the Unicode value hhhh (four hexadecimal digits).

字面量声明编译正则式在其声明之时。使用时正则字面量不会改变。比如在循环中使用字面量声明,正则不会重新编译在每次迭代中。

构造器正则,比如new RegExp("ab+c"),提供实时运行的正则表达式,适用于当你知道正则会改变时,或者表达式未知来源于其他源,如用户输入

  1. ^等价于:

    [\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]

  2. ^等价于:

    [^\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]

属性

For properties available on RegExp instances, see Properties of RegExp instances.
prototype
允许增加属性
Properties inherited from Function:

方法

For methods available on RegExp instances, see Methods of RegExp instances.
全局对象 RegExp 自身没有方法, 不过它会继承一些方法通过原型链
Methods inherited from Function:

RegExp 实例

Properties

See also Deprecated RegExp Properties

Note that several of the RegExp properties have both long and short (Perl-like) names. Both names always refer to the same value. Perl is the programming language from which JavaScript modeled its regular expressions.

RegExp.prototype.constructor
Specifies the function that creates an object's prototype.
RegExp.prototype.global
Whether to test the regular expression against all possible matches in a string, or only against the first.
RegExp.prototype.ignoreCase
Whether to ignore case while attempting a match in a string.
RegExp.prototype.lastIndex
The index at which to start the next match.
RegExp.prototype.multiline
Whether or not to search in strings across multiple lines.
RegExp.prototype.source
The text of the pattern.
RegExp.prototype.sticky
Whether or not the search is sticky.
Properties inherited from Object:

Methods

See also Deprecated RegExp Methods

RegExp.prototype.exec()
Executes a search for a match in its string parameter.
RegExp.prototype.test()
Tests for a match in its string parameter.
RegExp.prototype.toSource()
Returns an object literal representing the specified object; you can use this value to create a new object. Overrides the Object.prototype.toSource method.
RegExp.prototype.toString()
Returns a string representing the specified object. Overrides the Object.prototype.toString() method.

例子

例子: 使用正则改变数据结构

下例使用  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".

例子: Using a regular expression with the "sticky" flag

This example demonstrates how one could use the sticky flag on regular expressions to match individual lines of multiline input.

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"

One can test at run-time whether the sticky flag is supported, using try { … } catch { … }. For this, either an eval(…) expression or the RegExp(regex-string, flags-string) syntax must be used (since the /regex/flags notation is processed at compile-time, so throws an exception before the catch block is encountered). For example:

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+

Example: Regular expression and Unicode characters

As mentioned above, \w or \W only matches ASCII based characters; for example, 'a' to 'z', 'A' to 'Z', 0 to 9 and '_'. To match characters from other languagessuch as Cyrillic or Hebrew, use \uhhhh., where "hhhh" is the character's Unicode value in hexadecimal. This example demonstrates how one can separate out Unicode characters from a word.

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

Here's an external resource for getting the complete Unicode block range for different scripts: Regexp-unicode-block

Browser compatibility

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support ? (Yes) ? ? ?
Feature Android Firefox Mobile (Gecko) IE Phone Opera Mobile Safari Mobile
Basic support ? (Yes) ? ? ?

See also

Document Tags and Contributors

Contributors to this page: ziyunfei, akawhy, shi_zheng, Mickeyboy, GreatHan, Hans huang, fishenal
最后编辑者: fishenal,