2正则表达式.docx
- 文档编号:13525594
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:19
- 大小:26.37KB
2正则表达式.docx
《2正则表达式.docx》由会员分享,可在线阅读,更多相关《2正则表达式.docx(19页珍藏版)》请在冰点文库上搜索。
2正则表达式
入门简介
简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。
我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或sed shell程序等。
此外,象JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。
由此可见,正则表达式已经超出了某种语言或某个系统的局限,成为人们广为接受的概念和功能。
正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。
举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确。
如果通过正则表达式验证用户邮件地址的格式正确,用户所填写的表单信息将会被正常处理;反之,如果用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。
由此可见正则表达式在WEB应用的逻辑判断中具有举足轻重的作用。
基本语法
在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。
正则表达式的形式一般如下:
/love/
其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。
用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。
为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。
所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
较为常用的元字符包括:
“+”, “*”,以及 “?
”。
其中,“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次,“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次,而“?
”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
下面,就让我们来看一下正则表达式元字符的具体应用。
/fo+/
因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。
/eg*/
因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的 “easy”, “ego”, 或者 “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。
/Wil?
/
因为上述正则表达式中包含“?
”元字符,表示可以与目标对象中的 “Win”, 或者 “Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。
除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。
例如,
/jim{2,6}/
上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。
在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式。
\s:
用于匹配单个空格符,包括tab键和换行符;
\S:
用于匹配除单个空格符之外的所有字符;
\d:
用于匹配从0到9的数字;
\w:
用于匹配字母,数字或下划线字符;
\W:
用于匹配所有与\w不匹配的字符;
. :
用于匹配除换行符之外的所有字符。
(说明:
我们可以把\s和\S以及\w和\W看作互为逆运算)
下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。
/\s+/
上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。
/\d000/
如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。
除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。
定位符用于规定匹配模式在目标对象中的出现位置。
较为常用的定位符包括:
“^”, “$”, “\b” 以及 “\B”。
其中,“^”定位符规定匹配模式必须出现在目标字符串的开头,“$”定位符规定匹配模式必须出现在目标对象的结尾,\b定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一,而“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。
同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。
举例来说:
/^hell/
因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以 “hell”, “hello”或 “hellhound”开头的字符串相匹配。
/ar$/
因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。
/\bbom/
因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。
/man\b/
因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。
为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。
例如:
/[A-Z]/
上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。
/[a-z]/
上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。
/[0-9]/
上述正则表达式将会与从0到9范围内任何一个数字相匹配。
/([a-z][A-Z][0-9])+/
上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。
这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。
“()”符号包含的内容必须同时出现在目标对象中。
因此,上述正则表达式将无法与诸如 “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。
如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。
例如:
/to|too|2/
上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。
正则表达式中还有一个较为常用的运算符,即否定符 “[^]”。
与我们前文所介绍的定位符 “^” 不同,否定符 “[^]”规定目标对象中不能存在模式中所规定的字符串。
例如:
/[^A-C]/
上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。
一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。
最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\”。
例如:
/Th\*/
上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。
正则表达式语法
正则表达式是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”)。
模式描述在搜索文本时要匹配的一个或多个字符串。
下面是正则表达式的一些示例:
表达式
匹配
/^\s*$/
匹配空行。
/\d{2}-\d{5}/
验证由两位数字、一个连字符再加5位数字组成的ID号。
/<\s*(\S+)(\s[^>]*)?
>[\s\S]*<\s*\/\1\s*>/
匹配HTML标记。
下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为:
字符
说明
\
将下一字符标记为特殊字符、文本、反向引用或八进制转义符。
例如,“n”匹配字符“n”。
“\n”匹配换行符。
序列“\\”匹配“\”,“\(”匹配“(”。
^
匹配输入字符串开始的位置。
如果设置了RegExp对象的Multiline属性,^还会与“\n”或“\r”之后的位置匹配。
$
匹配输入字符串结尾的位置。
如果设置了RegExp对象的Multiline属性,$还会与“\n”或“\r”之前的位置匹配。
*
零次或多次匹配前面的字符或子表达式。
例如,zo*匹配“z”和“zoo”。
*等效于{0,}。
+
一次或多次匹配前面的字符或子表达式。
例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。
+等效于{1,}。
?
零次或一次匹配前面的字符或子表达式。
例如,“do(es)?
”匹配“do”或“does”中的“do”。
?
等效于{0,1}。
{n}
n是非负整数。
正好匹配n次。
例如,“o{2}”与“Bob”中的“o”不匹配,但与“food”中的两个“o”匹配。
{n,}
n是非负整数。
至少匹配n次。
例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有o。
'o{1,}'等效于'o+'。
'o{0,}'等效于'o*'。
{n,m}
m和n是非负整数,其中n<=m。
至少匹配n次,至多匹配m次。
例如,“o{1,3}”匹配“fooooood”中的头三个o。
'o{0,1}'等效于'o?
'。
注意:
您不能将空格插入逗号和数字之间。
?
当此字符紧随任何其他限定符(*、+、?
、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。
“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。
例如,在字符串“oooo”中,“o+?
”只匹配单个“o”,而“o+”匹配所有“o”。
.
匹配除“\n”之外的任何单个字符。
若要匹配包括“\n”在内的任意字符,请使用诸如“[\s\S]”之类的模式。
(pattern)
匹配pattern并捕获该匹配的子表达式。
可以使用$0...$9属性从结果“匹配”集合中检索捕获的匹配。
若要匹配括号字符(),请使用“\(”或者“\)”。
(?
:
pattern)
匹配pattern但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。
这对于用“或”字符(|)组合模式部件的情况很有用。
例如,与“industry|industries”相比,“industr(?
:
y|ies)”是一个更加经济的表达式。
(?
=pattern)
执行正向预测先行搜索的子表达式,该表达式匹配处于匹配pattern的字符串的起始点的字符串。
它是一个非捕获匹配,即不能捕获供以后使用的匹配。
例如,“Windows(?
=95|98|NT|2000)”与“Windows2000”中的“Windows”匹配,但不与“Windows3.1”中的“Windows”匹配。
预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
(?
!
pattern)
执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串。
它是一个非捕获匹配,即不能捕获供以后使用的匹配。
例如,“Windows(?
!
95|98|NT|2000)”与“Windows3.1”中的“Windows”匹配,但不与“Windows2000”中的“Windows”匹配。
预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
x|y
与x或y匹配。
例如,“z|food”与“z”或“food”匹配。
“(z|f)ood”与“zood”或“food”匹配。
[xyz]
字符集。
匹配包含的任一字符。
例如,“[abc]”匹配“plain”中的“a”。
[^xyz]
反向字符集。
匹配未包含的任何字符。
例如,“[^abc]”匹配“plain”中的“p”。
[a-z]
字符范围。
匹配指定范围内的任何字符。
例如,“[a-z]”匹配“a”到“z”范围内的任何小写字母。
[^a-z]
反向范围字符。
匹配不在指定的范围内的任何字符。
例如,“[^a-z]”匹配任何不在“a”到“z”范围内的任何字符。
\b
匹配一个字边界,即字与空格间的位置。
例如,“er\b”匹配“never”中的“er”,但不匹配“verb”中的“er”。
\B
非字边界匹配。
“er\B”匹配“verb”中的“er”,但不匹配“never”中的“er”。
\cx
匹配由x指示的控制字符。
例如,\cM匹配一个Control-M或回车符。
x的值必须在A-Z或a-z之间。
如果不是这样,则假定c就是“c”字符本身。
\d
数字字符匹配。
等效于[0-9]。
\D
非数字字符匹配。
等效于[^0-9]。
\f
换页符匹配。
等效于\x0c和\cL。
\n
换行符匹配。
等效于\x0a和\cJ。
\r
匹配一个回车符。
等效于\x0d和\cM。
\s
匹配任何空白字符,包括空格、制表符、换页符等。
与[\f\n\r\t\v]等效。
\S
匹配任何非空白字符。
等价于[^ \f\n\r\t\v]。
\t
制表符匹配。
与\x09和\cI等效。
\v
垂直制表符匹配。
与\x0b和\cK等效。
\w
匹配任何字类字符,包括下划线。
与“[A-Za-z0-9_]”等效。
\W
任何非字字符匹配。
与“[^A-Za-z0-9_]”等效。
\xn
匹配n,此处的n是一个十六进制转义码。
十六进制转义码必须正好是两位数长。
例如,“\x41”匹配“A”。
“\x041”与“\x04”&“1”等效。
允许在正则表达式中使用ASCII代码。
\num
匹配num,此处的num是一个正整数。
到捕获匹配的反向引用。
例如,“(.)\1”匹配两个连续的相同字符。
\n
标识一个八进制转义码或反向引用。
如果\n前面至少有n个捕获子表达式,那么n是反向引用。
否则,如果n是八进制数(0-7),那么n是八进制转义码。
\nm
标识一个八进制转义码或反向引用。
如果\nm前面至少有nm个捕获子表达式,那么nm是反向引用。
如果\nm前面至少有n个捕获,那么n是反向引用,后面跟m。
如果前面的条件均不存在,那么当n和m是八进制数(0-7)时,\nm匹配八进制转义码nm。
\nml
当n是八进制数(0-3),m和l是八进制数(0-7)时,匹配八进制转义码nml。
\un
匹配n,其中n是以四位十六进制数表示的Unicode字符。
例如,\u00A9匹配版权符号(©)。
正则表达式的用途
典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。
虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。
通过使用正则表达式,可以:
∙测试字符串内的模式。
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。
这称为数据验证。
∙替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
∙基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本。
例如,您可能需要搜索整个Web站点,删除过时的材料,以及替换某些HTML格式标记。
在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该HTML格式标记。
此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。
然后可以使用正则表达式来删除过时的材料。
最后,可以使用正则表达式来搜索和替换标记。
正则表达式在JScript或C等语言中也很有用,这些语言的字符串处理能力还不为人们所知。
生成正则表达式
正则表达式的结构与算术表达式的结构类似。
即,各种元字符和运算符可以将小的表达式组合起来,创建大的表达式。
通过在一对分隔符之间放置表达式模式的各种组件,就可以构建正则表达式。
对于JScript,分隔符是正斜杠(/)字符。
例如:
/expression/
在上面的示例中,正则表达式模式(expression)存储在RegExp对象的Pattern属性中。
正则表达式的组件可以是单个字符、字符集、字符的范围、在几个字符之间选择或者所有这些组件的任何组合。
优先级顺序
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
运算符
说明
\
转义符
(),(?
:
),(?
=),[]
括号和中括号
*,+,?
{n},{n,},{n,m}
限定符
^,$,\anymetacharacter,anycharacter
定位点和序列
|
替换
字符的优先级比替换运算符高,替换运算符允许“m|food”与“m”或“food”匹配。
若要匹配“mood”或“food”,请使用括号创建子表达式,从而产生“(m|f)ood”。
普通字符
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。
这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
正则表达式的最简单形式是在搜索字符串中匹配其本身的单个普通字符。
例如,单字符模式,如A,不论出现在搜索字符串中的何处,它总是匹配字母A。
下面是一些单字符正则表达式模式的示例:
/a/
/7/
/M/
可以将许多单字符组合起来以形成大的表达式。
例如,以下正则表达式组合了单字符表达式:
a、7和M。
/a7M/
请注意,没有串联运算符。
只须在一个字符后面键入另一个字符。
特殊字符
许多元字符要求在试图匹配它们时特别对待。
若要匹配这些特殊字符,必须首先使字符“转义”,即,将反斜杠字符(\)放在它们前面。
下表列出了特殊字符以及它们的含义:
特殊字符
注释
$
匹配输入字符串结尾的位置。
如果设置了RegExp对象的Multiline属性,那么$还匹配\n或\r前面的位置。
若要匹配$字符本身,请使用\$。
()
标记子表达式的开始和结束。
可以捕获子表达式以供以后使用。
若要匹配这两个字符,请使用\(和\)。
*
零次或多次匹配前面的字符或子表达式。
若要匹配*字符,请使用\*。
+
一次或多次匹配前面的字符或子表达式。
若要匹配+字符,请使用\+。
.
匹配除换行符\n之外的任何单个字符。
若要匹配.,请使用\。
[]
标记中括号表达式的开始。
若要匹配这些字符,请使用\[和\]。
?
零次或一次匹配前面的字符或子表达式,或指示“非贪心”限定符。
若要匹配?
字符,请使用\?
。
\
将下一字符标记为特殊字符、文本、反向引用或八进制转义符。
例如,字符n匹配字符n。
\n匹配换行符。
序列\\匹配\,序列\(匹配(。
/
表示文本正则表达式的开始或结束。
若要匹配/字符,请使用\/。
^
匹配输入字符串开始处的位置,但在中括号表达式中使用的情况除外,在那种情况下它对字符集求反。
若要匹配^字符本身,请使用\^。
{}
标记限定符表达式的开始。
若要匹配这些字符,请使用\{和\}。
|
指出在两个项之间进行选择。
若要匹配|,请使用\|
限定符
如果您不能指定构成匹配的字符的数量,那么正则表达式支持限定符的概念。
这些限定符使您能够指定,为使匹配为真,正则表达式的某个给定组件必须出现多少次。
下表说明各种限定符以及它们的含义:
字符
说明
*
零次或多次匹配前面的字符或子表达式。
例如,zo*匹配z和zoo。
*等效于{0,}。
+
一次或多次匹配前面的字符或子表达式。
例如,zo+匹配zo和zoo,但不匹配z。
+等效于{1,}。
?
零次或一次匹配前面的字符或子表达式。
例如,do(es)?
匹配do或does中的do。
?
等效于{0,1}。
{n}
n是非负整数。
正好匹配n次。
例如,o{2}不匹配Bob中的o,但匹配food中的两个o。
{n,}
n是非负整数。
至少匹配n次。
例如,o{2,}不匹配Bob中的o,而匹配foooood中的所有o。
o{1,}等效于o+。
o{0,}等效于o*。
{n,m}
m和n是非负整数,其中n<=m。
至少匹配n次,至多匹配m次。
例如,o{1,3}匹配fooooood中的头三个o。
o{0,1}等效于o?
。
注意:
您不能将空格插入逗号和数字之间。
由于章节编号在大的输入文档中会很可能超过九,所以您需要一种方式来处理两位或三位章节编号。
限定符给您这种能力。
下面的正则表达式匹配编号为任何位数的章节标题:
/Chapter[1-9][0-9]*/
请注意,限定符出现在范围表达式之后。
因此,它应用于整个范围表达式,在本例中,只指定从0到9的数字(包括0和9)。
这里不使用+限定符,因为在第二个位置或后面的位置不一定需要有一个数字。
也不使用?
字符,因为它将章节编号限制到只有两位数。
您需要至少匹配Chapter和空格字符后面的一个数字。
如果您知道章节编号被限制为只有99章,可以使用下面的表达式来至少指定一位但至多两位数字。
/Chapter[0-9]{1,2}/
上面的表达式的缺点是,大于99的章节编号仍只匹配开头两位数字。
另一个缺点是Chapter0也将匹配。
只匹配两位数字的更好的表达式如下:
/Chapter[1-9][0-9]?
/
或
/Chapter[1-9][0-9]{0,1}/
*、+和?
限定符都被称为“贪心的”,因为它们匹配尽可能多的文本。
但是,有时您只需要最小的匹配。
例如,您可能搜索HTML文档,以查找括在H1标记内的章节标题。
该文本在您的文档中如下:
Chapter1–IntroductiontoRegularExpressions
下面的表达式匹配从开始小于符号(<)到关闭H1标记的大于符号(>)之间的所有内容。
/<.*>/
如果您只需要匹配开始H1标记,下面的“非贪心”表达式只匹配
。
/<.*?
>/
通过在*、+或?
限定符之后放置?
,该表达式从“贪心”表达式转换为“非贪心”表达式或者最小匹配。
本节前面的主题中的示例只涉及章节标题查找。
字符串Chapter后面跟空
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 正则 表达式