JavaScript 正则表达式教程(二)
原文:
zh.annas-archive.org/md5/AD8C3DA0D9CFBFFA54C8E09B7C43FD93译者:飞龙
附录 A. JavaScript 正则表达式速查表
在本附录中,您可以找到 JavaScript 中正则表达式中使用的模式的摘要,以及它们的描述,以及一些有用的测试和创建正则表达式的方法。
本附录将涵盖以下正则表达式主题:
-
字符类和文字
-
字符集
-
边界和量词
-
分组、选择和反向引用
-
有用的方法
字符类
在下表中,您可以找到字符类的模式,这些模式告诉正则表达式匹配单个字符:
| 模式 | 描述 | 示例 |
|---|---|---|
. | 这匹配任何字符,除了换行符或其他 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 | 这匹配任何非数字字符。它等同于[⁰-9]。 | /\D/ 匹配 "R2-D2" 中的 "R" |
\s | 这匹配任何单个空格字符。它等同于[ \t\r\n\v\f]。 | /\s/ 匹配 "foo bar" 中的 " " |
\S | 这匹配任何单个非空格字符。它等同于[^ \t\r\n\v\f]。 | /\S/ 匹配 "foo bar" 中的 "foo" |
文字
在下表中,您可以找到文字字符的模式,这些模式告诉正则表达式匹配特殊字符:
| 模式 | 描述 | 示例 |
|---|---|---|
字母数字 | 这些字符本身匹配。 | /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 ^" 中的 "^" |
字符集
在下表中,您可以找到字符集的模式,这些模式告诉正则表达式仅匹配几个字符中的一个。
| 模式 | 描述 | 示例 |
|---|---|---|
[xyz] | 这匹配字符集中的任何一个字符。您可以使用连字符表示范围。例如,/[a-z]/ 匹配字母表中的任何字母,/[0-9]/ 匹配任何单个数字。 | /[ao]/ 匹配 "bar" 中的 "a" |
[^xyz] | 这匹配任何一个不在字符集中的字符。 | /[^ao]/ 匹配 "bar" 中的 "b" |
边界
在下表中,您可以找到边界的模式,这将告诉正则表达式在什么位置进行匹配。
| 模式 | 描述 | 示例 |
|---|---|---|
^ | 这匹配输入的开头。如果多行标志设置为 true,则也匹配 (\n) 换行字符之后的位置。 | /^ The/ 匹配 "The" 中的 "The",但不匹配 "In The stars" |
$ | 这匹配输入的结尾。如果多行标志设置为 true,则也匹配 (\n) 换行字符之前的位置。 | /和$/ 匹配 "land" 中的 "and",但不匹配 "and the bar" |
\b | 这匹配任何单词边界(测试字符必须存在于字符串中单词的开头或结尾)。 | /va\b/ 在“this is a java script book”中匹配“va”,但不匹配“this is a javascript book”。 |
\B | 这匹配任何非单词边界。 | /va\B/ 在“this is a JavaScript book”中匹配“va”,但不匹配“this is a JavaScript book”。 |
分组、交替和反向引用
在下表中,您可以找到分组、交替和反向引用的模式。分组用于在正则表达式中分组一组字符。交替用于将字符组合成单个正则表达式,而反向引用用于匹配与以前捕获组匹配的相同文本:
| 模式 | 描述 | 示例 |
|---|---|---|
(x) | 这将字符分组在一起以创建一个子句,即匹配x并记住匹配。这些称为捕获括号。 | /(foo)/ 在“foo bar”中匹配并记住“foo”。 |
() | 括号还用于捕获模式内所需的子模式。 | /(\d\d)\/(\d\d)\/(\d\d\d\d)/ 在“12/12/2000”中匹配“12”、“12”和“2000”。 |
(?:x) | 这匹配x但不捕获它。换句话说,括号内的项目不会创建编号引用。这些称为非捕获括号。 | /(?:foo)/ 匹配但不记住“foo”在“foo bar”中。 |
| | 交替将子句组合成一个正则表达式,然后匹配任何单个子句。 x|y匹配x或y。它类似于“OR”语句。 | /morning|night/ 在“good morning”中匹配“morning”,在“good night”中匹配“night”。 |
()\n | 在正则表达式模式的末尾添加"\n"(其中 n 是 1-9 之间的数字)允许您在模式内部反向引用一个子模式,因此,子模式的值被记住并用作匹配的一部分。 | /(no)\1/ 在“nono”中匹配“nono”。 "\1"被替换为模式内的第一个子模式的值,或(no),形成最终模式。 |
量词
在下表中,您可以找到量词的模式,它们指定了输入中必须存在多少个字符、组或字符类的实例才能找到匹配。
| 模式 | 描述 | 示例 |
|---|---|---|
{n} | 这匹配正则表达式的确切n次出现。 | /\d{5}/ 在“1234567890”中匹配“12345”(五个数字)。 |
{n,} | 这匹配正则表达式的n次或更多次出现。 | /\d{5,}/ 在“1234567890”中匹配“1234567890”(至少五个数字)。 |
{n,m} | 这匹配正则表达式的n到m次出现。 | /\d{5,7}/ 在“1234567890”中匹配“1234567”(至少五个数字,最多七个数字)。 |
* | 这匹配零次或更多次出现,等同于{0,}。 | /fo*/ 在“foo”中匹配“foo”,在“fooooooooled”中匹配“foooooooo”。 |
+ | 这匹配一次或多次出现,等同于{1,}。 | /o+/ 在“foo”中匹配“oo”。 |
? | 这匹配零次或一次出现,等同于{0,1}。 | /fo?/ 在“foo”中匹配“fo”,在“fairy”中匹配“f”。 |
+?``*? | ?也可以用在*、+、?或{}量词之后,使后者匹配非贪婪,或最小次数,而不是默认的最大次数。 | /\d{2,4}?/ 在字符串“12345”中匹配“12”,而不是由于量词非贪婪的末尾的?而匹配“1234”。 |
x(?=y) | 正向先行断言:仅当x后面跟着y时才匹配x。请注意,y不作为匹配的一部分,只作为必需条件。 | /Java(?=Script|Hut)/ 在“JavaScript”或“JavaHut”中匹配“Java”,但不匹配“JavaLand”。 |
x(?!y) | 负向先行断言:仅当x后面不跟着y时才匹配x。请注意,y不作为匹配的一部分,只起到必要的条件。 | /^\d+(?! years)/ 在"5 days"或"5 books"中匹配"5",但不匹配"5 years"。 |
JavaScript 正则表达式方法
在下表中,您可以找到用于匹配或测试正则表达式的方法。正则表达式中使用的主要 JavaScript 对象是String和RegExp,它们表示模式(如regular expression)。
| 方法 | 描述 | 示例 |
|---|---|---|
String.match(regular expression) | 这在字符串中执行基于正则表达式的匹配搜索。 | var myString = "today is 12-12-2000";``var matches = myString.match(/\d{4}/);``//返回数组["2000"] |
RegExp.exec(string) | 这在其字符串参数中执行匹配搜索。与String.match不同,输入的参数应该是一个字符串,而不是正则表达式模式。 | var pattern = /\d{4}/;``pattern.exec("today is 12-12-2000");``//返回数组["2000"] |
String.replace(regular expression, replacement text) | 这搜索并用替换文本替换正则表达式部分(匹配)。 | var phone = "(201) 123-4567";``var phoneFormatted = phone.replace(/[\(\)-\s]/g, "");``//返回 2011234567(删除了()-和空格) |
String.split (string literal or regular expression) | 这根据正则表达式或固定字符串将字符串分割成子字符串数组。 | var oldstring = "1,2, 3, 4, 5";``var newstring = oldstring.split(/\s*,\s*/);``//返回数组["1","2","3","4","5"] |
String.search(regular expression) | 这在字符串中测试匹配。它返回匹配的索引,如果没有找到则返回-1。 | var myString = "today is 12-12-2000";``myString.search(/\d{4}/);``//返回 15 - 2000 的索引 |
RegExp.test(string) | 这测试给定的字符串是否与正则表达式匹配,如果匹配则返回 true,否则返回 false。 | var pattern = /\d{4}/;``pattern.test("today is 12-12-2000");``//返回 true |
在本附录中,我们非常简要地介绍了本书中学到的模式,以便日常查阅。