十二、附录 d:正则表达式

当使用正则表达式时(在第 4 章中讨论),可以匹配文字字符串,例如:

>>> "some text".match(/me/)

【“我”】

但是正则表达式的真正力量来自匹配模式,而不是文字字符串。下表描述了您可以在模式中使用的不同语法,并提供了一些它们的使用示例。

|

模式

|

描述

| | --- | --- | | [abc] | 匹配一类字符。

>>> "some text".match(/[otx]/g)
["o", "t", "x", "t"]

| | [a-z] | 定义为范围的一类字符。例如 [a-d][abcd], [a-z]相同,匹配所有小写字符, [a-zA-Z0-9_]匹配所有字符、数字和下划线字符。

>>> "Some Text".match(/[a-z]/g)
["o", "m", "e", "e", "x", "t"]
>>> "Some Text".match(/[a-zA-Z]/g)
["S", "o", "m", "e", "T", "e", "x", "t"]

| | [^abc] | 匹配字符类匹配的所有而不是的内容。

>>> "Some Text".match(/[^a-z]/g)
["S", " ", "T"]

| | a|b | 匹配 ab。管道字符表示“或”,可以多次使用。

>>> "Some Text".match(/t|T/g);
["T", "t"]
>>> "Some Text".match(/t|T|Some/g);
["Some", "T", "t"]

| | a(?=b) | 仅当后跟 b时匹配 a

>>> "Some Text".match(/Some(?=Tex)/g);
null
>>> "Some Text".match(/Some(?= Tex)/g);
["Some"]

| | a(?!b) | 仅当后面没有跟随 b时匹配 a

>>> "Some Text".match(/Some(?! Tex)/g);
null
>>> "Some Text".match(/Some(?!Tex)/g);
["Some"]

| | \ | 转义字符用于帮助您将模式中使用的特殊字符匹配为文字。

>>> "R2-D2".match(/[2-3]/g)
["2", "2"]
>>> "R2-D2".match(/[2\-3]/g)
["2", "-", "2"]

| | \n``\r``\f``\t``\v | 换行回车换页标签垂直标签 | | \s | 空格,或者上面五个转义序列中的任何一个。

>>> "R2\n D2".match(/\s/g)
["\n", " "]

| | \S | 与上述相反;匹配除空白以外的所有内容。与 [^\s]:相同

>>> "R2\n D2".match(/\S/g)
["R", "2", "D", "2"]

| | \w | 任何字母、数字或下划线。与 [A-Za-z0-9_]相同。

>>> "Some text!".match(/\w/g)
["S", "o", "m", "e", "t", "e", "x", "t"]

| | \W | \w对面。

>>> "Some text!".match(/\W/g)
[" ", "!"]

| | \d | 匹配一个数字,与[0-9]相同。

>>> "R2-D2 and C-3PO".match(/\d/g)
["2", "2", "3"]

| | \D | \d对面;匹配非数字,与[^0-9]或[^\d].]相同

>>> "R2-D2 and C-3PO".match(/\D/g)
["R", "-", "D", " ", "a", "n", "d", " ", "C", "-", "P", "O"]

| | \b | 匹配单词边界,如空格或标点符号。匹配研发,后跟 2:

>>> "R2D2 and C-3PO".match(/[RD]2/g)
["R2", "D2"]
Same as above but only at the end of a word:
>>> "R2D2 and C-3PO".match(/[RD]2\b/g)
["D2"]
Same pattern but the input has a dash, which is also an end of a word:
>>> "R2-D2 and C-3PO".match(/[RD]2\b/g)
["R2", "D2"]

| | \B | \b的反义词。

>>> "R2-D2 and C-3PO".match(/[RD]2\B/g)
null
>>> "R2D2 and C-3PO".match(/[RD]2\B/g)
["R2"]

| | [\b] | 匹配退格字符 | | \0 | 空字符 | | \u0000 | 匹配由四位十六进制数表示的 Unicode 字符。

>>> "стоян".match(/\u0441\u0442\u043E/)
["сто"]

| | \x00 | 匹配由两位十六进制数表示的字符代码。

>>> "dude".match(/\x64/g)
["d", "d"]

| | ^ | 要匹配的字符串的开头。如果设置了 m修改器(多行),它将匹配每一行的开头。

>>> "regular\nregular\nexpression".match(/r/g);
["r", "r", "r", "r", "r"]
>>> "regular\nregular\nexpression".match(/^r/g);
["r"]
>>> "regular\nregular\nexpression".match(/^r/mg);
["r", "r"]

| | $ | 匹配输入的结尾,或者在使用多行修饰符时,匹配每行的结尾。

>>> "regular\nregular\nexpression".match(/r$/g);
null
>>> "regular\nregular\nexpression".match(/r$/mg);
["r", "r"]

| | | 匹配除新行和换行符之外的任何字符。

>>> "regular".match(/r./g);
["re"]
>>> "regular".match(/r.../g);
["regu"]

| | * | 如果出现 0 次或更多次,则匹配前面的模式。例如 /.*/将匹配任何不包含任何内容的内容(空输入)。

>>> "".match(/.*/)
[""]
>>> "anything".match(/.*/)
["anything"]
>>> "anything".match(/n.*h/)
["nyth"]

| | ? | 如果出现 0 或 1 次,则匹配前面的模式。

>>> "anything".match(/ny?/g)
["ny", "n"]

| | + | 匹配前面的模式,如果它至少出现一次(或多次)。

>>> "anything".match(/ny+/g)
["ny"]
>>> "R2-D2 and C-3PO".match(/[a-z]/gi)
["R", "D", "a", "n", "d", "C", "P", "O"]
>>> "R2-D2 and C-3PO".match(/[a-z]+/gi)
["R", "D", "and", "C", "PO"]

| | {n} | 如果恰好出现 n次,则匹配前面的模式。

>>> "regular expression".match(/s/g)
["s", "s"]
>>> "regular expression".match(/s{2}/g)
["ss"]
>>> "regular expression".match(/\b\w{3}/g)
["reg", "exp"]

| | {min,max} | 如果出现在 minmax之间的次数,则匹配前面的模式。您可以省略 max,这将意味着没有最大值,但只有最小值。您不能省略 min.输入为“嘟嘟”且“o”重复 10 次的示例:

>>> "doooooooooodle".match(/o/g)
["o", "o", "o", "o", "o", "o", "o", "o", "o", "o"]
>>> "doooooooooodle".match(/o{2}/g)
["oo", "oo", "oo", "oo", "oo"]
>>> "doooooooooodle".match(/o{2,}/g)
["oooooooooo"]
>>> "doooooooooodle".match(/o{2,6}/g)
["oooooo", "oooo"]

| | (pattern) | 当模式在括号中时,它会被记住,以便可以用于替换。这也称为捕获模式。捕获的匹配可作为 $1, $2,... $9获得匹配所有出现的“r”并重复它们:

>>> "regular expression".replace(/(r)/g, '$1$1')
"rregularr exprression"
Matching "re" and turning it to "er":
>>> "regular expression".replace (/(r)(e)/g, '$2$1')
"ergular experssion"

| | (?:pattern) | 非捕获模式,不记得,在 $1, $2..中不可用。这里有一个“re”如何匹配的例子,但是“r”没有被记住,第二个模式变成了 $1:

>>> "regular expression".replace (/(?:r)(e)/g, '$1$1')
"eegular expeession"

|

当一个特殊字符可以有两种含义时,一定要注意,如 ^, ?\b的情况。