【MSDN】正则表达式介绍
原文链接:https://msdn.microsoft.com/zh-cn/library/28hw3sce(v=vs.100).aspx
典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。 虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。
通过使用正则表达式,可以:
-
测试字符串内的模式。
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。 这称为数据验证。
-
替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
-
基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本。
例如,您可能需要搜索整个网站,删除过时的材料,以及替换某些 HTML 格式标记。 在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记。 此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。 然后可以使用正则表达式来删除过时的材料。 最后,可以使用正则表达式来搜索和替换标记。
正则表达式在 JScript 或 C 等语言中也很有用,这些语言的字符串处理能力还不为人们所知。
其他资源
创建正则表达式
“正则表达式”描述在搜索文本正文时要匹配的一个或多个字符串。 正则表达式可用作与要搜索的文本相比较的字符模式。
正则表达式的结构与所创建的算术表达式的结构类似。 较大的表达式可由小的表达式通过使用各种元字符和运算符进行组合而创建。
正则表达式的各组成部分可以是单个字符、字符集、字符范围或在几个字符之间选择。 也可以是这些组成部分的任意组合。
正则表达式 |
说明 |
---|---|
/^\s*$/ |
匹配空行。 |
/\d{2}-\d{5}/ |
匹配由两位数字、一个连字符再加五位数字组成的 ID 号。 |
/<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/ |
匹配 HTML 标记。 |
以下是 JScript 单字符正则表达式的一些示例。
/a/ /7/ /M/
可以将多个单字符组合起来以形成较长的表达式。 例如,正则表达式 /the/ 会匹配以下搜索字符串中的“the”:“the”、“there”、“other”和“over the lazy dog”。
无需使用任何串联运算符。 只需连续输入字符即可。
有关更多信息,请参见正则表达式语法。
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。 这包括所有大小写字母、所有数字、所有标点符号和一些符号。
若要匹配搜索字符串中包含的句点 (.),则可以在表达式中句点的前面放置一个反斜杠 (\)。 表达式 /filename\.ext/ 匹配“filename.ext”。
括号表达式中的任何字符均仅与正则表达式中紧邻括号表达式的单个字符相匹配。 例如,/Chapter [12345]/ 表达式匹配“Chapter 1”、“Chapter 2”、“Chapter 3”、“Chapter 4”和“Chapter 5”。
要使用范围代替字符本身来表示匹配字符,可以使用连字符 (-)。 表达式 /Chapter [1-5]/ 与 /Chapter [12345]/ 等效。
若要查找不在列表或范围内的所有字符,请将插入符号 (^) 放在列表的开头。 例如,表达式 /[^aAeEiIoOuU]/ 匹配任何非元音字符。
有关更多信息,请参见匹配字符的列表。
限定符引用在其前面并与其紧邻(左侧)的表达式。
限定符位于大括号 {} 中,并包含指示出现次数上下限的数值。 例如,c{1,2} 匹配 1 个或 2 个字母 c。
仅指定一个数字时,除非其后紧跟一个逗号,否则表示上限。 例如,c{3} 匹配 3 个字符 c,而 c{5,} 匹配 5 个或更多字母 c。
还可以使用单字符限定符,如下表所示。
限定符 |
显式限定符 |
含义 |
---|---|---|
* |
{0,} |
匹配上一个元素零次或多次。 |
+ |
{1,} |
匹配上一个元素一次或多次。 |
? |
{0,1} |
匹配前面的元素零次或一次。 |
以下是一些表达式示例及其匹配的搜索字符串。
正则表达式 |
限定符的含义 |
匹配 |
---|---|---|
/Chapter [1-9][0-9]{0,}/ 或 /Chapter [1-9][0-9]*/ |
匹配 [0-9] 零次或多次。 |
“Chapter 1”、“Chapter 25”、“Chapter 401320” |
/Chapter [0-9]{1,2}/ |
匹配 [0-9] 一次或两次。 |
“Chapter 0”、“Chapter 03”、“Chapter 1”、“Chapter 25”、“Chapter 40” |
/Chapter [1-9][0-9]{0,1}/ 或 /Chapter [1-9][0-9]?/ |
匹配 [0-9] 零次或一次。 |
“Chapter 1”、“Chapter 25”、“Chapter 40” |
有关更多信息,请参见 JScript 中的限定符。
可以从正则表达式和替换字符串中引用子表达式。 有关更多信息,请参见 JScript 中的反向引用。
正则表达式编程
可以在 JScript 中使用正则表达式搜索字符串中的模式、替换文本以及提取子字符串。
创建该正则表达式的语句为
var re = /\w+/g;
/\w+/ 模式指定匹配以下一个或多个任意字符:A-Z、a-z、0-9 和下划线字符。 模式之后的 g(全局)标志,指示搜索操作应查找该模式的所有匹配项,而不仅仅是第一个匹配项。
还可以使用以下 JScript 替换语法。
var re = new RegExp("\\w+", "g");
要检索每个匹配项,exec 方法 将从 lastIndex 位置继续搜索,直到返回 Null。
function SearchGlobal() { var src = "The quick brown fox jumps over the lazy dog."; // Create a regular expression pattern that has a global flag. var re = /\w+/g; var result; // Get the first match. result = re.exec(src); while (result != null) { print (result.index + "-" + result.lastIndex + "\t" + result[0]); // Get the next match. // Because the global flag is set, the search starts at the // position of lastIndex. result = re.exec(src); } // Output: // 0-3 The // 4-9 quick // 10-15 brown // 16-19 fox // 20-25 jumps // 26-30 over // 31-34 the // 35-39 lazy // 40-43 dog }
以下示例仅查找第一个匹配项。 因为未设置全局 (g) 标志,搜索操作将从搜索字符串的起始位置开始。
function SearchNonGlobal() { var src = "The quick brown fox jumps over the lazy dog."; // Create a regular expression that does not have // a global flag. var re = /\w+/; // Get the first match. // Because the global flag is not set, the search starts // from the beginning of the string. var result = re.exec(src); if (result == null) print ("not found"); else { print (result.index + "-" + result.lastIndex + "\t" + result[0]); } // Output: // 0-3 The }
该示例使用 replace 方法。
function ReplaceGlobal() { var src = "The batter hit the ball with the bat "; src += "and the fielder caught the ball with the glove."; // Replace "the" with "a". var re = /the/g; var result = src.replace(re, "a"); print(result); // Output: // The batter hit a ball with a bat and a fielder caught a ball with a glove. }
在以下示例中,该模式包含三个子匹配项。 子匹配字符串与每个匹配项一起显示。
exec 方法 将返回一个数组。 数组元素 0 包含了完整的匹配项,而元素 1 到 n 包含子匹配项。
function SearchWithSubmatches() { var result; var src = "Please send mail to george@contoso.com and someone@example.com. Thanks!"; // Create a regular expression to search for an e-mail address. // Include the global flag. // (More sophisticated RegExp patterns are available for // matching an e-mail address.) var re = /(\w+)@(\w+)\.(\w+)/g; // Get the first match. result = re.exec(src); while (result != null) { print ("e-mail address: " + result[0]); // Get the submatched parts of the address. print ("user name: " + result[1]); print ("host name: " + result[2]); print ("top-level domain: " + result[3]); print (""); // Get the next match. result = re.exec(src); } // Output: // e-mail address: george@contoso.com // user name: george // host name: contoso // top-level domain: com // e-mail address: someone@example.com // user name: someone // host name: example // top-level domain: com }
下表显示了允许的标志。
JScript 标志 |
如果标志存在 |
---|---|
g |
查找搜索字符串中该模式的所有匹配项,而不仅仅是第一个匹配项。 |
i |
搜索不区分大小写。 |
m |
^ 匹配 \n 或 \r 之后的位置,而 $ 匹配 \n 或 \r 之前的位置。 无论标志是否存在,^ 均匹配搜索字符串开头的位置,而 $ 均匹配搜索字符串结尾的位置。 |
功能 |
说明 |
---|---|
将正则表达式编译为内部格式,从而更快地执行。 |
|
测试搜索字符串内是否存在模式。 |
|
返回首个匹配项的位置。 |
正则表达式语法
“正则表达式”描述在搜索文本正文时要匹配的一个或多个字符串。 该表达式可用作一个将字符模式与要搜索的字符串相匹配的模板。
正则表达式包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。
![]() |
---|
若要匹配这些特殊字符之一,必须首先转义字符,即,在字符前面加反斜杠字符 (\)。 例如,若要搜索“+”文本字符,可使用表达式“\+”。 |
元字符 |
行为 |
示例 |
---|---|---|
* |
零次或多次匹配前面的字符或子表达式。 等效于 {0,}。 |
zo* 与“z”和“zoo”匹配。 |
+ |
一次或多次匹配前面的字符或子表达式。 等效于 {1,}。 |
zo+ 与“zo”和“zoo”匹配,但与“z”不匹配。 |
? |
零次或一次匹配前面的字符或子表达式。 等效于 {0,1}。 当 ? 紧随任何其他限定符(*、+、?、{n}、{n,} 或 {n,m})之后时,匹配模式是非贪婪的。 非贪婪模式匹配搜索到的、尽可能少的字符串, 而默认的贪婪模式匹配搜索到的、尽可能多的字符串。 |
zo? 与“z”和“zo”匹配,但与“zoo”不匹配。 o+? 只与“oooo”中的单个“o”匹配,而 o+ 与所有“o”匹配。 do(es)? 与“do”或“does”中的“do”匹配。 |
^ |
匹配搜索字符串开始的位置。 如果标志中包括 m(多行搜索)字符,^ 还将匹配 \n 或 \r 后面的位置。 如果将 ^ 用作括号表达式中的第一个字符,则会对字符集求反。 |
^\d{3} 与搜索字符串开始处的 3 个数字匹配。 [^abc] 与除 a、b 和 c 以外的任何字符匹配。 |
$ |
匹配搜索字符串结尾的位置。 如果标志中包括 m(多行搜索)字符,^ 还将匹配 \n 或 \r 前面的位置。 |
\d{3}$ 与搜索字符串结尾处的 3 个数字匹配。 |
. |
匹配除换行符 \n 之外的任何单个字符。 若要匹配包括 \n 在内的任意字符,请使用诸如 [\s\S] 之类的模式。 |
a.c 与“abc”、“a1c”和“a-c”匹配。 |
[] |
标记括号表达式的开始和结尾。 |
[1-4] 与“1”、“2”、“3”或“4”匹配。[^aAeEiIoOuU] 与任何非元音字符匹配。 |
{} |
标记限定符表达式的开始和结尾。 |
a{2,3} 与“aa”和“aaa”匹配。 |
() |
标记子表达式的开始和结尾。 可以保存子表达式以备将来之用。 |
A(\d) 与“A0”至“A9”匹配。 保存该数字以备将来之用。 |
| |
指示在两个或多个项之间进行选择。 |
z|food 与“z”或“food”匹配。 (z|f)ood与“zood”或“food”匹配。 |
/ |
表示 JScript 中的文本正则表达式模式的开始或结尾。 在第二个“/”后添加单字符标志可以指定搜索行为。 |
/abc/gi 是与“abc”匹配的 JScript 文本正则表达式。g(全局)标志指定查找模式的所有匹配项,i(忽略大小写)标志使搜索不区分大小写。 |
\ |
将下一字符标记为特殊字符、文本、反向引用或八进制转义符。 |
\n 与换行符匹配。 \( 与“(”匹配。 \\ 与“\”匹配。 |
大多数特殊字符在括号表达式内出现时失去它们的意义,并表示普通字符。 有关更多信息,请参见匹配字符的列表中的“括号表达式中的字符”。
元字符 |
行为 |
示例 |
---|---|---|
\b |
与一个字边界匹配;即字与空格间的位置。 |
er\b 与“never”中的“er”匹配,但与“verb”中的“er”不匹配。 |
\B |
非边界字匹配。 |
er\B 与“verb”中的“er”匹配,但与“never”中的“er”不匹配。 |
\d |
数字字符匹配。 等效于 [0-9]。 |
在搜索字符串“12 345”中,\d{2}与“12”和“34”匹配。 \d与“1”、“2”、“3”、“4”和“5”匹配。 |
\D |
非数字字符匹配。 等效于 [^0-9]。 |
\D+ 与“abc123 def”中的“abc”和“def”匹配。 |
\w |
与以下任意字符匹配:A-Z、a-z、0-9 和下划线。 等效于 [A-Za-z0-9_]。 |
在搜索字符串“The quick brown fox…”中,\w+与“The”、“quick”、“brown”和“fox”匹配。 |
\W |
与除 A-Z、a-z、0-9 和下划线以外的任意字符匹配。 等效于 [^A-Za-z0-9_]。 |
在搜索字符串“The quick brown fox…”中,\W+ 与“…”和所有空格匹配。 |
[xyz] |
字符集。 与任何一个指定字符匹配。 |
[abc] 与“plain”中的“a”匹配。 |
[^xyz] |
反向字符集。 与未指定的任何字符匹配。 |
[^abc] 与“plain”中的“p”、“l”、“i”和“n”匹配。 |
[a-z] |
字符范围。 匹配指定范围内的任何字符。 |
[a-z] 与“a”到“z”范围内的任何小写字母字符匹配。 |
[^a-z] |
反向字符范围。 与不在指定范围内的任何字符匹配。 |
[^a-z] 与不在范围“a”到“z”内的任何字符匹配。 |
{n} |
正好匹配 n 次。 n 是非负整数。 |
o{2} 与“Bob”中的“o”不匹配,但与“food”中的两个“o”匹配。 |
{n,} |
至少匹配 n 次。 n 是非负整数。 * 与 {0,} 相等。 + 与 {1,} 相等。 |
o{2,} 与“Bob”中的“o”不匹配,但与“foooood”中的所有“o”匹配。 |
{n,m} |
匹配至少 n 次,至多 m 次。 n 和 m 是非负整数,其中 n <= m。 逗号和数字之间不能有空格。 ? 与 {0,1} 相等。 |
在搜索字符串“1234567”中,\d{1,3}与“123”、“456”和“7”匹配。 |
(模式) |
与模式 匹配并保存匹配项。 您可以从由 JScript 中的 exec Method返回的数组元素中检索保存的匹配项。 若要匹配括号字符 ( ),请使用“\(”或者“\)”。 |
(Chapter|Section) [1-9] 与“Chapter 5”匹配,保存“Chapter”以备将来之用。 |
(?:模式) |
与模式 匹配,但不保存匹配项;即不会存储匹配项以备将来之用。 这对于用“or”字符 (|) 组合模式部件的情况很有用。 |
industr(?:y|ies) 与 industry|industries 相等。 |
(?=模式) |
正预测先行。 找到一个匹配项后,将在匹配文本之前开始搜索下一个匹配项。 不会保存匹配项以备将来之用。 |
^(?=.*\d).{4,8}$ 对密码应用以下限制:其长度必须介于 4 到 8 个字符之间,并且必须至少包含一个数字。 在该模式中,.*\d 查找后跟有数字的任意多个字符。 对于搜索字符串“abc3qr”,这与“abc3”匹配。 从该匹配项之前(而不是之后)开始,.{4,8} 与包含 4-8 个字符的字符串匹配。 这与“abc3qr”匹配。 ^ 和 $ 指定搜索字符串的开始和结束位置。 这将在搜索字符串包含匹配字符之外的任何字符时阻止匹配。 |
(?!模式) |
负预测先行。 匹配与模式 不匹配的搜索字符串。 找到一个匹配项后,将在匹配文本之前开始搜索下一个匹配项。 不会保存匹配项以备将来之用。 |
\b(?!th)\w+\b 与不以“th”开头的单词匹配。 在该模式中,\b 与一个字边界匹配。 对于搜索字符串“ quick ”,这与第一个空格匹配。 (?!th)与非“th”字符串匹配。 这与“qu”匹配。 从该匹配项开始,\w+ 与一个字匹配。 这与“quick”匹配。 |
\cx |
匹配 x 指示的控制字符。 x 的值必须在 A-Z 或 a-z 范围内。 如果不是这样,则假定 c 就是文本“c”字符本身。 |
\cM 与 Ctrl+M 或一个回车符匹配。 |
\xn |
匹配 n,此处的 n 是一个十六进制转义码。 十六进制转义码必须正好是两位数长。 允许在正则表达式中使用 ASCII 代码。 |
\x41 与“A”匹配。 \x041 等效于后跟有“1”的“\x04”(因为 n 必须正好是两位数)。 |
\num |
匹配 num,此处的 num 是一个正整数。 这是对已保存的匹配项的引用。 |
(.)\1 与两个连续的相同字符匹配。 |
\n |
标识一个八进制转义码或反向引用。 如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。 否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。 |
(\d)\1 与两个连续的相同数字匹配。 |
\nm |
标识一个八进制转义码或反向引用。 如果 \nm 前面至少有 nm 个捕获子表达式,那么nm 是反向引用。 如果 \nm 前面至少有 n 个捕获子表达式,则 n 是反向引用,后面跟有文本 m。 如果上述情况都不存在,当 n 和 m 是八进制数字 (0-7) 时,\nm 匹配八进制转义码 nm。 |
\11 与制表符匹配。 |
\nml |
当 n 是八进制数字 (0-3),m 和 l 是八进制数字 (0-7) 时,匹配八进制转义码 nml。 |
\011 与制表符匹配。 |
\un |
匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。 |
\u00A9 与版权符号 (©) 匹配。 |
字符 |
匹配 |
等效于 |
---|---|---|
\f |
换页符。 |
\x0c 和 \cL |
\n |
换行符。 |
\x0a 和 \cJ |
\r |
回车符。 |
\x0d 和 \cM |
\s |
任何空白字符。 其中包括空格、制表符和换页符。 |
[ \f\n\r\t\v] |
\S |
任何非空白字符。 |
[^ \f\n\r\t\v] |
\t |
Tab 字符。 |
\x09 和 \cI |
\v |
垂直制表符。 |
\x0b 和 \cK |
下表按从高到低的顺序包含了正则表达式运算符的优先级顺序。
运算符 |
说明 |
---|---|
\ |
转义符 |
(), (?:), (?=), [] |
括号和中括号 |
*、+、?、{n}、{n,}、{n,m} |
限定符 |
^、$、\任何元字符 |
定位点和序列 |
| |
替换 |
字符具有高于替换运算符的优先级,例如,允许“m|food”匹配“m”或“food”。
概念
匹配字符的列表
可以通过将一个或多个单个字符括在中括号 [ ] 中来创建匹配字符的列表。 当字符括在中括号内时,该列表称为“中括号表达式”。
中括号表达式中的字符均仅与正则表达式中紧邻中括号表达式的单个字符相匹配。 下面的 JScript 正则表达式与“Chapter 1”、“Chapter 2”、“Chapter 3”、“Chapter 4”和“Chapter 5”匹配。
/Chapter [12345]/
中括号表达式指定的只是匹配紧跟在单词 Chapter 和空格后面的单个字符位置的字符集。 这是第九个字符位置。
-
如果右中括号字符 (]) 不是第一项,则它结束一个列表。 若要匹配列表中的右中括号字符,请将它放在第一位,紧跟在左中括号 ([) 后面。
-
反斜杠字符 (\) 仍为转义字符。 若要匹配反斜杠字符,请使用两个反斜杠 (\\)。
/Chapter [1-5]/
开始值和结束值均包括在范围内。 注意,还有一点很重要,按 Unicode 排序顺序,开始值必须在结束值的前面。 各个字符的字符值决定它们在范围内的相对顺序。
中括号表达式的典型用途是指定任何大写或小写字母字符或任何数字的匹配。 下面的表达式指定了这样的匹配。
/[A-Za-z0-9]/
在表达式中包括连字符
若要在中括号表达式中包括连字符,可以使用下列方法之一:
-
在它前面放置一个反斜杠转义符,如下面的表达式所示。
[\-]
-
将连字符放在中括号列表的开始或结尾。 下面的表达式匹配所有小写字母和连字符。
[-a-z] [a-z-]
-
创建一个范围,在该范围中,开始字符值小于连字符,而结束字符值等于或大于连字符。 下面的两个正则表达式都满足这些要求。
[!--] [!-~]
/Chapter [^12345]/
在前面的示例中,表达式与第九个位置中除 1、2、3、4 或 5 之外的任何字符匹配。 这样,例如,“Chapter 7”就是一个匹配项,“Chapter 9”也是一个匹配项。
使用连字符 (-) 可以表示同样的表达式。 下面的表达式指定了这样的匹配。
/Chapter [^1-5]/
若要匹配搜索字符串中包含的句点 (.),则可以在正则表达式中句点的前面放置一个反斜杠 (\)。 正则表达式 /filename\.ext/ 匹配“filename.ext”。
概念
定位点
定位点使您能够将正则表达式固定到行或输入字符串的起始位置或结尾。 它们还使您能够创建匹配一个单词的开头、结尾或内部字符的表达式。
例如,在表达式 er\b 中,\b 匹配字边界。 该表达式与“never”中的“er”匹配,但与“verb”中的“er”不匹配。
字符 |
说明 |
---|---|
^ |
匹配输入字符串开始的位置。 如果标志中包括 m(多行搜索)字符,^ 还将匹配 \n 或 \r 后面的位置。 |
$ |
匹配输入字符串结尾的位置。 如果标志中包括 m(多行搜索)字符,$ 还将匹配 \n 或 \r 前面的位置。 |
\b |
匹配一个字边界,即字与空格间的位置。 |
\B |
非字边界匹配。 |
不能将限定符与定位点一起使用。 由于在紧靠换行或者字边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。
若要匹配一行文本开始处的文本,请在正则表达式的开始使用 ^ 字符。 不要将 ^ 的这种用法与中括号表达式内的用法混淆。
若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用 $ 字符。
若要在搜索章节标题时使用定位点,下面的正则表达式匹配一个章节标题,该标题只包含两个尾随数字,并且出现在行首:
/^Chapter [1-9][0-9]{0,1}/
真正的章节标题不仅出现行的开始处,而且它还是该行中仅有的文本。 它即出现在行首又出现在同一行的结尾。 下面的表达式能确保指定的匹配只匹配章节而不匹配交叉引用。 通过创建只匹配一行文本的开始和结尾的正则表达式,就可做到这一点。
/^Chapter [1-9][0-9]{0,1}$/
匹配字边界稍有不同,但向正则表达式添加了很重要的能力。 字边界是单词和空格之间的位置。 非字边界是任何其他位置。 下面的表达式匹配单词“Chapter”的前三个字符,因为这三个字符位于字边界后面:
/\bCha/
\b 字符的位置是非常重要的。 如果它位于要匹配的字符串的开始,它在单词的开始处查找匹配项。 如果它位于字符串的结尾,它在单词的结尾处查找匹配项。 例如,下面的表达式匹配单词“Chapter”中的字符串“ter”,因为它位于字边界的前面:
/ter\b/
下面的表达式匹配“Chapter”中的字符串“apt”,但不匹配“aptitude”中的该字符串:
/\Bapt/
字符串“apt”没有位于单词“Chapter”的字边界处,但位于单词“aptitude”中的字边界处。 对于 \B 非字边界运算符,位置并不重要,因为匹配不关心究竟是单词的开头还是结尾。
其他资源
替换和子表达式
正则表达式中的替换允许您对两个或多个替换选项之间的选择进行分组。 实际上可以在模式中指定“this OR that”。
子表达式允许您匹配搜索文本中的模式并将匹配项分成多个单独的子匹配项。 程序可检索生成的子匹配项。 子表达式还允许您重新设置文本格式,如 JScript 中的反向引用中所述。
/Chapter|Section [1-9][0-9]{0,1}/
相反,正则表达式匹配后跟任何数字的单词“Chapter”或单词“Section”。 如果搜索字符串是“Section 22”,那么该表达式匹配“Section 22”。 但是,如果搜索字符串是“Chapter 22”,那么表达式匹配单词“Chapter”,而不是匹配“Chapter 22”。
带括号的替换
可以使用括号来限制替换的范围,即,确保它只应用于两个单词“Chapter”和“Section”。 可以通过添加括号来使正则表达式匹配“Chapter 1”或“Section 3”。
但是,括号还用于创建子表达式。 程序可检索生成的子匹配项。
下面的 JScript 正则表达式使用括号来组合“Chapter”和“Section”。 然后,可能的匹配项将包括后跟一个数字的“Chapter”。
/(Chapter|Section) [1-9][0-9]{0,1}/
Chapter|Section 周围的括号还将保存两个匹配字中的任一个供以后使用。
下面的示例演示如何在代码中检索匹配项和子匹配项。 由于在表达式中只有一组括号,因此,只有一个被保存的子匹配项。
var re = /(Chapter|Section) [1-9][0-9]{0,1}/g var src = "Chapter 50 Section 85" ShowMatches(src, re); // Output: // Chapter 50 // submatch 1: Chapter // Section 85 // submatch 1: Section // Perform a search on a string by using a regular expression, // and display the matches and submatches. function ShowMatches(src, re) { var result; // Get the first match. result = re.exec(src); while (result != null) { // Show the entire match. print(); print(result[0]); // Show the submatches. for (var index=1; index<result.length; index++) { print("submatch " + index + ": " + result[index]); } // Get the next match. result = re.exec(src); } }
不带保存的子匹配项的替换
在上一示例中,您只需要使用括号来组合单词“Chapter”和“Section”之间的选择。
若要防止子匹配项被保存以备将来使用,可以指定子表达式 (?:pattern)。 下面的示例和前一个示例执行的是同样的操作,但它不保存子匹配项。
var re = /(?:Chapter|Section) [1-9][0-9]{0,1}/g var src = "Chapter 50 Section 85" ShowMatches(src, re); // Output: // Chapter 50 // Section 85
在下面的示例中,正则表达式包含三个子表达式。 子匹配字符串与每个匹配项一起显示。
var re = /(\w+)@(\w+)\.(\w+)/g var src = "Please send mail to george@contoso.com and someone@example.com. Thanks!" ShowMatches(src, re); // The ShowMatches function is provided earlier. // Output: // george@contoso.com // submatch 1: george // submatch 2: contoso // submatch 3: com // someone@example.com // submatch 1: someone // submatch 2: example // submatch 3: com
下面的示例将通用资源指示符 (URI) 分解为其组件。
第一个括号子表达式保存 Web 地址的协议部分。 它匹配在冒号和两个正斜杠前面的任何单词。 第二个括号子表达式保存地址的域地址部分。 它匹配不包括左斜线 (/) 或冒号 (:) 字符的任何字符序列。 第三个括号子表达式保存网站端口号(如果指定了的话)。 它匹配冒号后面的零个或多个数字。 第四个括号子表达式保存 Web 地址指定的路径和/或页信息。 它匹配零个或多个数字字符 (#) 或空白字符之外的字符。
var re = /(\w+):\/\/([^\/:]+)(:\d*)?([^# ]*)/gi; var src = "http://msdn.microsoft.com:80/scripting/default.htm"; ShowMatches(src, re); // Output: // http://msdn.microsoft.com:80/scripting/default.htm // submatch 1: http // submatch 2: msdn.microsoft.com // submatch 3: :80 // submatch 4: /scripting/default.htm
在下面的示例中,执行了搜索以确定密码的长度是否介于 4 到 8 个字符之间,并且至少包含一个数字。
在正则表达式中,.*\d 查找后跟一个数字的任意多个字符。 对于搜索字符串“abc3qr”,这与“abc3”匹配。 从该匹配项之前(而不是之后)开始,.{4,8} 与包含 4 到 8 个字符的字符串匹配。 这与“abc3qr”匹配。
^ 和 $ 指定搜索字符串的开始和结束位置。 这将在搜索字符串包含匹配字符之外的任何字符时阻止匹配。
var re = /^(?=.*\d).{4,8}$/gi var src = "abc3qr" ShowMatches(src, re); // The ShowMatches function is provided earlier. // Output: // abc3qr
负预测先行将搜索与消极的预测先行表达式中的模式不匹配的搜索字符串。 找到一个匹配项后,将在匹配文本之前开始搜索下一个匹配项。 不会保存匹配项以备将来之用。 若要指定负预测先行,请使用语法 (?!pattern)。
下面的示例匹配不以“th”开头的单词。
在正则表达式中,\b 将匹配单词边界。 对于搜索字符串“ quick ”,这与第一个空格匹配。 (?!th) 与非“th”字符串匹配。 这与“qu”匹配。 从该匹配项开始,\w+ 与一个字匹配。 这与“quick”匹配。
var re = /\b(?!th)\w+\b/gi var src = "The quick brown fox jumps over the lazy dog." ShowMatches(src, re); // Output: // quick // brown // fox // jumps // over // lazy // dog
正则表达式示例
本节包含了一些代码示例,用以阐释如何在常见应用程序中使用正则表达式。
![]() |
---|
System.Web.RegularExpressions 命名空间包含很多可实现预定义的正则表达式模式来分析 HTML、XML 和 ASP.NET 文档中的字符串的正则表达式对象。 例如,TagRegex 类标识字符串中的开始标记,CommentRegex 类标识字符串中的 ASP.NET 注释。 |
posted on 2016-10-13 10:04 msmailcode 阅读(258) 评论(0) 编辑 收藏 举报