LINUX SHELL 正则表达式语法Word文档格式.docx
《LINUX SHELL 正则表达式语法Word文档格式.docx》由会员分享,可在线阅读,更多相关《LINUX SHELL 正则表达式语法Word文档格式.docx(18页珍藏版)》请在冰点文库上搜索。
![LINUX SHELL 正则表达式语法Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/28/4851247b-b922-4f75-b336-8cae2453d156/4851247b-b922-4f75-b336-8cae2453d1561.gif)
{n}
n是一个非负整数。
匹配确定的n次。
o{2}'
不能匹配"
Bob"
中的'
o'
,但是能匹配"
food"
中的两个o。
{n,}
至少匹配n次。
o{2,}'
,但能匹配"
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"
,而'
将匹配所有'
.
匹配除"
\n"
之外的任何单个字符。
要匹配包括'
在内的任何字符,请使用象'
[.\n]'
的模式。
(pattern)
匹配pattern并获取这一匹配。
所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在VisualBasicScriptingEdition中则使用$0…$9属性。
要匹配圆括号字符,请使用'
\('
或'
\)'
(?
:
pattern)
匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
这在使用"
或"
字符(|)来组合一个模式的各个部分是很有用。
例如,'
industr(?
y|ies)就是一个比'
industry|industries'
更简略的表达式。
=pattern)
正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。
这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
Windows(?
=95|98|NT|2000)'
Windows2000"
中的"
Windows"
,但不能匹配"
Windows3.1"
预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
!
负向预查,在任何不匹配Negativelookaheadmatchesthesearchstringatanypointwhereastringnotmatchingpattern的字符串开始处匹配查找字符串。
例如'
95|98|NT|2000)'
x|y
匹配x或y。
z|food'
(z|f)ood'
zood"
[xyz]
字符集合。
匹配所包含的任意一个字符。
[abc]'
plain"
a'
[^xyz]
负值字符集合。
匹配未包含的任意字符。
[^abc]'
中的'
p'
[a-z]
字符范围。
匹配指定范围内的任意字符。
[a-z]'
可以匹配'
到'
z'
范围内的任意小写字母字符。
[^a-z]
负值字符范围。
匹配任何不在指定范围内的任意字符。
[^a-z]'
可以匹配任何不在'
范围内的任意字符。
\b
匹配一个单词边界,也就是指单词和空格间的位置。
er\b'
可以匹配"
never"
er'
verb"
\B
匹配非单词边界。
er\B'
\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为八进制数字(0-7),则n为一个八进制转义值。
\nm
如果\nm之前至少有isprecededbyatleastnm个获取得子表达式,则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匹配版权符号(?
)。
正则表达式使用详解
作者:
吕晓波
如果我们问那些UNIX系统的爱好者他们最喜欢什么,答案除了稳定的系统和可以远程启动之外,十有八九的人会提到正则表达式;
如果我们再问他们最头痛的是什么,可能除了复杂的进程控制和安装过程之外,还会是正则表达式。
那么正则表达式到底是什么?
如何才能真正的掌握正则表达式并正确的加以灵活运用?
本文将就此展开介绍,希望能够对那些渴望了解和掌握正则表达式的读者有所助益。
入门简介
简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。
我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或sedshell程序等。
此外,象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”等相匹配。
使用实例
在对正则表达式有了较为全面的了解之后,我们就来看一下如何在Perl,PHP,以及JavaScript中使用正则表达式。
通常,Perl中正则表达式的使用格式如下:
operator/regular-expression/string-to-replace/modifiers
运算符一项可以是m或s,分别代表匹配运算和替换运算。
其中,正则表达式一项是将要进行匹配或替换操作的模式,可以由任意字符,元字符,或定位符等组成。
替换字符串一项是使用s运算符时,对查找到的模式匹配对象进行替换的字符串。
最后的参数项用来控制不同的匹配或替换方式。
s/geed/good/
将会在目标对象中查找第一个出现的geed字串,并将其替换为good。
如果我们希望在目标对象的全局范围内执行多次查找?
替换操作的话,可以使用参数“g”,即s/love/lust/g。
此外,如果我们不需要限制匹配的大小写形式的话,可以使用参数“i”。
m/JewEL/i
上述正则表达式将会与目标对象中的jewel,Jewel,或JEWEL相匹配。
在Perl中,使用专门的运算符“=~”指定正则表达式的匹配对象。
$flag=~s/abc/ABC/
上述正则表达式将会把变量$flag中的字串abc替换为ABC。
下面,我们就在Perl程序中加入正则表达式,验证用户邮件地址格式的有效性。
代码如下:
#!
/usr/bin/perl
#getinput
print“What'
syouremailaddress?
\n”;
$email=<
STDIN>
chomp($email);
#matchanddisplayresult
if($email=~/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/)
{
print(“Youremailaddressiscorrect!
\n”);
}
else
{
print(“Pleasetryagain!
}
如果用户更偏爱PHP的话,可以使用ereg()函数进行模式匹配操作。
ereg()函数的使用格式如下:
ereg(pattern,string)
其中,pattern代表正则表达式的模式,而string则是执行查找替换操作的目标对象。
同样是验证邮件地址,使用PHP编写的程序代码如下:
<
php
if(ereg(“^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+”,$email))
{echo“Youremailaddressiscorrect!
”;
}
else
{echo“Pleasetryagain!
?
>
最后,我们在来看一下JavaScript。
JavaScript1.2中带有一个功能强大的RegExp()对象,可以用来进行正则表达式的匹配操作。
其中的test()方法可以检验目标对象中是否包含匹配模式,并相应的返回true或false。
我们可以使用JavaScript编写以下脚本,验证用户输入的邮件地址的有效性。
html>
<
head>
<
scriptlanguage="
Javascript1.2"
<
--starthiding
functionverifyAddress(obj)
{
varemail=obj.email.value;
varpattern=/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
flag=pattern.test(email);
if(flag)
{
alert(“Youremailaddressiscorrect!
”);
returntrue;
}
else
{
alert(“Pleasetryagain!
returnfalse;
}
}
//stophiding-->
/script>
<
/head>
body>
formonSubmit="
returnverifyAddress(this);
inputname="
email"
type="
text"
inputtype="
submit"
/form>
/body>
<
/html>
正则表达式中的特殊字符
字符/
意义:
对于字符,通常表示按字面意义,指出接着的字符为特殊字符,不作解释。
/b/匹配字符’b’,通过在b前面加一个反斜杠,也就是/b/,则该字符变成特殊字符,表示
匹配一个单词的分界线。
或者:
对于几个字符,通常说明是特殊的,指出紧接着的字符不是特殊的,而应该按字面解释。
*是一个特殊字符,匹配任意个字符(包括0个字符);
/a*/意味匹配0个或多个a。
为了匹配字面上的*,在a前面加一个反斜杠;
/a*/匹配’a*’。
字符^
表示匹配的字符必须在最前边。
/^A/不匹配"
anA,"
中的’A’,但匹配"
AnA."
中最前面的’A’。
字符$
与^类似,匹配最末的字符。
/t$/不匹配"
eater"
中的’t’,但匹配"
eat"
中的’t’。
字符*
匹配*前面的字符0次或n次。
例如:
/bo*/匹配"
Aghostbooooed"
中的’boooo’或"
Abirdwarbled"
中的’b’,但不匹配"
Agoatg
runted"
中的任何字符。
字符+
匹配+号前面的字符1次或n次。
等价于{1,}。
/a+/匹配"
candy"
中的’a’和"
caaaaaaandy."
中的所有’a’。
字符?
匹配?
前面的字符0次或1次。
/e?
le?
/匹配"
angel"
中的’el’和"
angle."
中的’le’。
字符.
(小数点)匹配除换行符外的所有单个的字符。
/.n/匹配"
nay,anappleisonthetree"
中的’an’和’on’,但不匹配’nay’。
字符(x)
匹配’x’并记录匹配的值。
/(foo)/匹配和记录"
foobar."
中的’foo’。
匹配子串能被结果数组中的素[1],...,[n]返
回,或被RegExp对象的属性,...,返回。
字符x│y
匹配’x’或者’y’。
/green│red/匹配"
greenapple"
中的’green’和"
redapple."
中的’red’。
字符{n}
这里的n是一个正整数。
匹配前面的n个字符。
/a{2}/不匹配"
candy,"
中的’a’,但匹配"
caandy,"
中的所有’a’和"
caaandy."
中前面的两个’a’。
字符{n,}
匹配至少n个前面的字符。
/a{2,}不匹配"
caandy"
中的所有’a’和"
中的所有’a’
字符{n,m}
这里的n和m都是正整数。
匹配至少n个最多m个前面的字符。
/a{1,3