六、附录 A:JavaScript 正则备忘单

在本附录中,您可以找到 JavaScript 中正则表达式所用模式的摘要及其描述,以及测试和创建正则表达式的有用方法列表。

本附录将涵盖以下 Regex 主题:

  • 字符类和文字
  • 字符集
  • 界限和量词
  • 分组、交替和反向引用
  • 有用的方法

字符类

在下表中,您可以找到字符类的模式,这些模式告诉 Regex 匹配单个字符:

|

模式

|

描述

|

例子

| | --- | --- | --- | | . | 这匹配任何字符,除了换行符或另一个 unicode 行结束符,如(\n, \r, \u2028\u2029)。 | /f.o/匹配“fao”、“feo”和“foo” | | \w | 这匹配任何字母数字字符,包括下划线。相当于[a-zA-Z0-9_]。 | /\w/匹配“foo”中的“f” | | \W | 这匹配任何单个非单词字符。相当于[^a-zA-Z0-9_]。 | /\W/匹配“100%”中的“%” | | \d | 这匹配任何一个数字。相当于[0-9]。 | /\d/匹配“100”中的“1” | | \D | 这与任何非数字匹配。相当于[^0-9]。 | /\D/匹配“R2-D2”中的“R” | | \s | 这匹配任何单个空格字符。相当于[ \t\r\n\v\f]。 | /\s/匹配“foo bar”中的“” | | \S | 这匹配任何单个非空格字符。相当于[^ \t\r\n\v\f]。 | /\S/匹配“foo bar”中的“foo” |

文字

在下表中,您可以找到文字字符的模式,这些模式告诉 Regex 匹配一个特殊字符:

|

模式

|

描述

|

例子

| | --- | --- | --- | | Alphanumeric | 这些完全匹配。 | /javascript book/匹配“javascript book”中的“javascript book” | | \0 | 这匹配一个NUL字符。 |   | | \n | 这与换行符匹配。 |   | | \f | 这与表单源字符匹配。 |   | | \r | 这与回车符匹配。 |   | | \t | 这与制表符匹配。 |   | | \v | 这与垂直制表符匹配。 |   | | [\b] | 这与退格字符匹配。 |   | | \xxx | 这与 ASCII 字符匹配,由xxx八进制数表示。 | /112/匹配“J”字符 | | \xdd | 这与 ASCII 字符匹配,用dd十六进制数表示。 | /x4A/匹配“J”字符 | | \uxxxx | 这与 ASCII 字符相匹配,用xxxx UNICODE 表示。 | /u0237/匹配“J”字符 | | \ | 这个表示下一个字符是否特殊,不做字面解释。 | /\^/匹配“char ^”中的“^” |

字符集

在下表中,您可以找到字符集的模式,这些模式告诉 Regex 只匹配几个字符中的一个字符。

|

模式

|

描述

|

例子

| | --- | --- | --- | | [xyz] | 这与字符集内的任何一个字符匹配。您可以使用连字符来表示范围。例如,/[a-z]/匹配字母表中的任意一个字母,而/[0-9]/匹配任意一个数字。 | /[ao]/匹配“条”中的“a” | | [^xyz] | 这匹配任何一个不包含在字符集内的字符。 | /[^ao]/匹配“条”中的“b” |

边界

在下面的表中,你可以找到边界的模式,这将告诉 Regex 在什么位置进行匹配。

|

模式

|

描述

|

例子

| | --- | --- | --- | | ^ | 这与输入的开头相匹配。如果多行标志设置为真,它也会在(\n)换行符之后立即匹配。 | /^ The/匹配《星星》中的“The”,但不匹配《星星》中的“The”。 | | $ | 这与输入的结尾相匹配。如果多行标志设置为真,它也与(\n)换行符之前的字符匹配。 | /$/匹配“地”中的“和”,但不匹配“和巴”。 | | \b | 这匹配任何单词边界(测试字符必须存在于字符串中单词的开头或结尾)。 | /va\b/匹配“这是一本 java 脚本书”中的“va”,但不匹配“这是一本 java script 书”。 | | \B | 这与任何非字边界匹配。 | /va\B/匹配“这是一本 JavaScript 书”中的“va”,但不匹配“这是一本 JavaScript 书”。 |

分组、交替、回指

在下面的表中,可以找到分组、交替和回溯的模式。分组用于对正则表达式中的一组字符进行分组。交替用于将字符组合成单个正则表达式,反向引用用于匹配捕获组先前匹配的相同文本:

|

模式

|

描述

|

例子

| | --- | --- | --- | | (x) | 这将字符组合在一起创建一个子句,即它匹配x并记住匹配。这些称为捕捉括号。 | /(foo)/匹配并记住“foo 吧”中的“foo”。 | | () | 括号还用于捕获模式中所需的子模式。 | /(\d\d)\/(\d\d)\/(\d\d\d\d)/匹配“12/12/2000”中的“12”、“12”和“2000”。 | | (?:x) | 这与x匹配,但不捕捉。换句话说,不会为括号内的项目创建编号引用。这些称为非捕获括号。 | /(?:foo)/匹配,但不记得“foo bar”中的“foo”。 | | | | Alternation 将子句组合成一个正则表达式,然后匹配任何单个子句。x|y匹配xy。它类似于“或”语句。 | /morning|night/匹配“早上好”中的“早上”,匹配“晚上好”中的“晚上”。 | | ()\n | “\n”(其中 n 是 1-9 之间的数字)当添加到常规表达式模式的末尾时,允许您支持引用模式内的子模式,因此,子模式的值被记住并用作匹配的一部分。 | /(no)\1/匹配“nono”中的“nono”。“\1”被替换为模式中第一个子模式的值,或者(否),以形成最终的模式。 |

量词

在下面的表中,您可以找到量词的模式,它指定了一个输入中必须有多少字符、组或字符类的实例才能找到匹配。

|

模式

|

描述

|

例子

| | --- | --- | --- | | {n} | 这与正则表达式的出现完全匹配。 | /\d{5}/匹配“1234567890”中的“12345”(五位数)。 | | {n,} | 这与一个正则表达式的n或更多次匹配。 | /\d{5,}/匹配“1234567890”中的“1234567890”(最少五位数)。 | | {n,m} | 这与正则表达式出现的次数nm 相匹配。 | /\d{5,7}/匹配“1234567890”中的“1234567897”(最少五位数,最多七位数)。 | | * | 这与零个或多个出现匹配,相当于{0,}。 | /fo*/匹配“foo”中的“foo”,匹配“fooooooooled”中的“foooooooo”。 | | + | 这与一个或多个事件相匹配,相当于{1,}。 | /o+/匹配“foo”中的“oo”。 | | ? | 这与零个或一个出现匹配,相当于{0,1}。 | /fo?/匹配“foo”中的“fo”,匹配“仙女”中的“f”。 | | +?``*? | "?"也可以跟在*+?{}量词后面使用,以使后面的匹配不重复,或者最小次数与默认最大次数进行比较。 | /\d{2,4}?/匹配“12345”字符串中的“12”,而不是“1234”,这是由于量词 nongreedy 末尾的“?”。 | | x(?=y) | 正向前瞻:只有跟在y后面,才匹配x。注意y不包括在比赛中,只是作为一个必要条件。 | /Java(?=Script|Hut)/匹配“JavaScript”或“JavaHut”中的“Java”,但不匹配“JavaLand”。 | | x(?!y) | 负前瞻:只有在没有跟在y后面的情况下,才匹配x。请注意,y不作为比赛的一部分,仅作为必要条件。 | /^\d+(?! years)/匹配“5 天”或“5 本书”中的“5”,但不匹配“5 年”。 |

JavaScript 正则表达式方法

在下面的表中,您可以找到用于匹配或测试正则表达式的方法。正则表达式中使用的主要 JavaScript 对象是StringRegExp,它们代表一种模式(如regular expression)。

|

方法

|

描述

|

例子

| | --- | --- | --- | | String.match(regular expression) | 这将基于正则表达式在字符串中执行匹配搜索。 | var myString = "today is 12-12-2000";``var matches = myString.match(/\d{4}/);``//returns array ["2000"] | | RegExp.exec(string) | 这会在其字符串参数中执行匹配搜索。与String.match不同,输入的参数应该是字符串,而不是正则表达式模式。 | var pattern = /\d{4}/;``pattern.exec("today is 12-12-2000");``//returns array ["2000"] | | String.replace(regular expression, replacement text) | 这会搜索正则表达式部分,并用替换的文本替换它。 | var phone = "(201) 123-4567";``var phoneFormatted = phone.replace(/[\(\)-\s]/g, "");``//returns 2011234567 (removed ( ) - and blank space) | | String.split (string literal or regular expression) | 这将根据正则表达式或固定字符串将字符串分解为子字符串数组。 | var oldstring = "1,2, 3, 4, 5";``var newstring = oldstring.split(/\s*,\s*/);``//returns the array ["1","2","3","4","5"] | | String.search(regular expression) | 这将测试字符串中的匹配。它返回匹配的索引,如果没有找到,则返回-1。 | var myString = "today is 12-12-2000";``myString.search(/\d{4}/);``//returns 15 - index of 2000 | | RegExp.test(string) | 这将测试给定的字符串是否匹配 Regexp,如果匹配则返回 true,如果不匹配则返回 false。 | var pattern = /\d{4}/;``pattern.test("today is 12-12-2000");``//returns true |

在本附录中,我们非常简要地介绍了本书中所学的模式,其格式易于日常参考。