正则表达式基础知识.docx
《正则表达式基础知识.docx》由会员分享,可在线阅读,更多相关《正则表达式基础知识.docx(28页珍藏版)》请在冰豆网上搜索。
正则表达式基础知识
1.正则表达式入门
(1)查找特定信息
(2)查找并编辑特定信息
从根本上来讲正则表达式有两个基本问题:
搜索和替换。
正则表达式是一种用来匹配和处理文字的字符串。
正则表达式在不同的应用程序和怨言中各有不同。
正则表达式是文本处理方面最强大的工具之一。
正则表达式语言用来构造正则表达式,正则表达式用来完成搜索和替换操作。
2.匹配单个字符
Ben是一个正则表达式。
正则表达式可以包含纯文本,甚至可以只包含纯文本
文本:
HellomynameisBen.
正则表达式:
Ben
结果:
HellomynameisBen.
文本:
HellomynameisBen.Pleasevisitmywebsite.
正则表达式:
my
结果:
HellomynameisBen.Pleasevisitemywebsite.
绝大多数的正则表达式引擎的默认行为是只返回第一个匹配结果。
具体到上面的例子,原始文本的第一个my通常是一个,但第二个往往不是。
字母的大小写问题:
正则表达式是区分大小写的,所以Ben不匹配ben。
不过绝大多数正则表达式的实现也支持不区分字母大小写的匹配操作。
匹配任意字符:
前面的正则表达式都是静态的纯文本,下面看看如何用正则表达式去匹配不可预知的字符。
在正则表达式里,特殊字符用来给出要搜索的东西。
.字符可以匹配任意一个单个的字符。
文本:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
正则表达式:
Sales
结果:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
.字符可以匹配任何单个的字符,字母,数字甚至是.字符本身。
文本:
sales.xls
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
正则表达式:
sales.
结果:
sales.xls
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
在一个正则表达式里允许多个.字符,他们既可以连续出现,也可以间隔出现在模式的不同位置。
文本:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
正则表达式:
.a.
结果:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
文本:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
正则表达式:
.a..
结果:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
匹配特殊字符:
.字符在正则表达式中有特殊的含义。
如果模式里需要一个.,就要想办法来告诉正则表达是你需要的是.字符本身而不是他在正则表达式里的特殊含义。
为此,你必须在.的前面加一个\(反斜杠)字符来对他进行转义。
\是一个元字符。
文本:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
正则表达式:
.a.\.xls
结果:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
如果要对\进行搜索,就必须对\进行转义;相应的转义序列是两个连学的反斜杠字符\\。
在绝大数正则表达式的实现里,.只能匹配除换行符以外的任何单个字符。
3.匹配多个字符中的某一个
在正则表达式里,我们可以用元字符[]来定义一个字符集合。
在使用[]定义的字符集合里,这两个元字符之间的所有字符都是该集合的组成部分,字符集合的匹配结果是能够与该集合里的任意一个成员相匹配的文本。
文本:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
正则表达式:
[ns]a.\.xls
结果:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
字符集合在需要区分字母大小写的搜索中比较常见:
文本:
Thephrase''regularexpression''isoftenabbreviatedasRegExorregex.
正则表达式:
[Rr]eg[Ee]x
结果:
Thephrase''regularexpression''isoftenabbreviatedasRegExorregex.
利用字符集合区间
文本:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
正则表达式:
[ns]a[0123456789]\.xls
结果:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
文本:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
正则表达式:
[ns]a[0-9]\.xls
结果:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
sum.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
模式[0-9]的功能与[0123456789]功能完全等价。
以下都是合法的字符区间:
A-Za-ZA-FA-z
在定义一个字符区间的时候,一定要避免让这个区间的尾字符小于它的首字符。
-是一个特殊的元字符,作为元字符只能用在[]之间。
在字符集合以外的地方,-只是一个普通字符,只能与-匹配。
在同一个字符集合里可以给出多个字幅区间。
[A-Za-z0-9]
文本:
正则表达式:
#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]
结果:
取非匹配:
除了字符集合里的字符,其他字符都可以匹配
文本:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
正则表达式:
[ns]a[^0-9]\.xls
结果:
sales1.xls
order3.xls
sale2.xls
sale3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
4.使用元字符
[也是元字符,它标志着一个字符集合的开始。
文本:
VarmyArray=newArray();
If(myArray[0]==0){
}
正则表达式:
myArray[0]
结果:
VarmyArray=newArray();
If(myArray[0]==0){
}
出现结果与预期不同,这是因为[]在正则表达式里是用来定义一个字符集合的元字符。
因此,myArry[0]只能匹配到myArry0。
文本:
VarmyArray=newArray();
If(myArray[0]==0){
}
正则表达式:
myArray\[0\]
结果:
VarmyArray=newArray();
If(myArray[0]==0){
}
对元字符进行转移需要用到\字符。
这意味着\字符也是元字符—它的特殊含义是对其它元字符进行转义。
因此在匹配\本身的时候,我们必须把它转义为\\。
文本:
\home\ben\sales
正则表达式:
\\
结果:
\home\ben\sales
匹配空白字符:
[\b]回退一个字符
\f换页符
\n换行符
\r回车符
\t制表符
\v垂直制表符
文本:
''101'',''Ben'',''Forta''
''102'','''Jim'',''James''
''103'',''Jim'',''Robertson''
''104'',''Bob'',''Bobson''
正则表达式:
\r\n\r\n
结果:
''101'',''Ben'',''Forta''
''102'','''Jim'',''James''
''103'',''Jim'',''Robertson''
''104'',''Bob'',''Bobson''
\r\n匹配一个回车换行组合。
使用回车换行组合进行的搜索将匹配到两个连续尾行标签,而那正是两条记录之间的空白行。
匹配数字:
\d任何一个数字字符\D任何一个非数字字符
文本:
VarmyArray=newArray();
If(myArray[0]==0){
}
正则表达式:
myArray\[\d\]
结果:
VarmyArray=newArray();
If(myArray[0]==0){
}
匹配字母和数字:
\w任何一个字母字符或者下划线字符\W任何一个非字母字符或非下划线字符
文本:
11213
A1C2E3
48075
48237
M1B4F2
90046
H1H2H2
正则表达式:
\w\d\w\d\w\d
结果:
11213
A1C2E3
48075
48237
M1B4F2
90046
H1H2H2
匹配空白字符:
\s任何一个空白字符(等价于[\f\n\r\t\v])\S任何一个非空白字符
匹配十六进制或八进制
十六进制数值要用前缀\x来给出。
八进制要用前缀\0来给出。
Posix字符类是很多正则表达式都支持的简写形式。
文本:
正则表达式:
#[[:
xdigit:
]][[:
xdigit:
]][[:
xdigit:
]][[:
xdigit:
]][[:
xdigit:
]][[:
xdigit:
]]
结果:
[[:
xdigit:
]]任何一个数字
学习如何让匹配多个连续重复的字符:
要想匹配同一个字符的多次重复,只要简单的给这个字符加上一个+字符作为后缀就行了。
a匹配a本身,a+将匹配一个或多个连续出现的a。
类似的,[0-9]匹配任意单个数字,[0-9]+将匹配一个或多个连续的数字。
文本:
Sendpersonalemailtoben@.Forquestionsaboutabookusesupport@.Feelfreetosendunsolicitedemailtospam@.
正则表达式:
\w+@\w+\.\w+
结果
Sendpersonalemailtoben@.Forquestionsaboutabookusesupport@.Feelfreetosendunsolicitedemailtospam@.
+是一个元字符如果要匹配+,必须要使用他的转义序列\+。
文本:
Sendpersonalemailtoben@orben.forta@.Forquestionsaboutabookusesupport@.Ifyourmessageisurgenttryben@.Feelfreetosendunsolicitedemailtospam@.
正则表达式:
[\w.]+@[\w.]+\.\w+
结果:
Sendpersonalemailtoben@orben.forta@.Forquestionsaboutabookusesupport@.Ifyourmessageisurgenttryben@.Feelfreetosendunsolicitedemailtospam@.
文本:
Sendpersonalemailtoben@orben.forta@.Forquestionsaboutabookusesupport@.Ifyourmessageisurgenttryben@.Feelfreetosendunsolicitedemailtospam@.
正则表达式:
[\w.]+@[\w.]+\.\w+
结果:
Sendpersonalemailtoben@orben.forta@.Forquestionsaboutabookusesupport@.Ifyourmessageisurgenttryben@.Feelfreetosendunsolicitedemailtospam@.
匹配零个或多个字符:
+匹配一个或多个字符,但不匹配零个字符——+至少也要匹配一个字符。
*的用法跟+一样——质押把它放在一个字符的后面,就可以匹配该字符连续出现零次或多次的情况。
文本:
Hello.ben@ismyemailaddress.
正则表达式:
[\w.]+@[\w.]+\.\w+
结果:
Hello.ben@ismyemailaddress.
文本:
Hello.ben@ismyemailaddress.
正则表达式:
\w+[\w.]*@[\w.]+\.\w+
结果:
Hello.ben@ismyemailaddress.
*是一个元字符,如果要匹配*本身就必须用他的转义字符\*。
匹配一个或零个字符:
文本:
TheURLisconnectsecurelyuseinstead.
正则表达式:
http:
//[\w./]+
结果:
TheURLisconnectsecurelyuseinstead.
只能匹配到第一个URL地址,没能匹配到第二个。
文本:
TheURLisconnectsecurelyuseinstead.
正则表达式:
https?
:
//[\w./]+
结果:
TheURLisconnectsecurelyuseinstead.
https?
:
//既可以匹配http:
//,也可以匹配https:
//。
文本:
''101'',''Ben'',''Forta''
''102'','''Jim'',''James''
''103'',''Jim'',''Robertson''
''104'',''Bob'',''Bobson''
正则表达式:
[\r]?
\n[\r]?
\n
结果:
''101'',''Ben'',''Forta''
''102'','''Jim'',''James''
''103'',''Jim'',''Robertson''
''104'',''Bob'',''Bobson''
?
是一个元字符。
如果需要匹配?
本身,就必须使用他的转义序列\?
。
匹配的重复次数:
为匹配次数设定一个精确值
文本:
正则表达式:
#[[:
xdigit:
]]{6}
结果:
为重复匹配次数设定一个区间:
{}语法还可以用来为重复匹配次数设定一个区间——也就是为重复匹配次数设定一个最大值和最小值
文本:
4/8/03
10-6-2004
2/2/2
01-01-01
正则表达式:
\d{1,2}[-\/]\d{1,2}[-\/]\d{2,4}
结果:
4/8/03
10-6-2004
2/2/2
01-01-01
在这个例子中使用了/的转义字符\/。
这在许多正则表达式的实现中是不必要的。
但是有些正则表达式分析其要求我们必须这么做。
为避免不必要的麻烦,在需要匹配/字符本身的时候,最好总是使用转义字符。
匹配至少重复多少次:
文本:
1001:
$496.80
1002:
$1290.69
1003:
$26.43
1004:
$613.42
1005:
$7.61
1006:
$414.90
1007:
$25.00
正则表达式:
\d+:
\$\d{3,}\.\d{2}
结果:
1001:
$496.80
1002:
$1290.69
1003:
$26.43
1004:
$613.42
1005:
$7.61
1006:
$414.90
1007:
$25.00
防止过度匹配:
文本:
ThisofferisnotavailabletocustomerslivinginAKandHI.
正则表达式:
<[Bb]>.*[Bb]>
结果:
ThisofferisnotavailabletocustomerslivinginAKandHI.
*?
是*的懒惰型版本,懒惰的含义是匹配尽可能少的字符。
文本:
ThisofferisnotavailabletocustomerslivinginAKandHI.
正则表达式:
<[Bb]>.*?
[Bb]>
结果:
ThisofferisnotavailabletocustomerslivinginAKandHI.
6.位置匹配
位置匹配用来解决解决在什么地方进行字符串匹配操作的问题。
文本:
Thecatscatteredhisfoodallovertheroom.
正则表达式:
cat
结果:
Thecatscatteredhisfoodallovertheroom.
单词边界:
第一种单词边界是有限定符\b指定的单词边界。
\b用来匹配一个单词的开始或结尾。
文本:
Thecatscatteredhisfoodallovertheroom.
正则表达式:
\bcat\b
结果:
Thecatscatteredhisfoodallovertheroom.
文本:
Thecaptainworehiscapandcapeproundlyashesatlisteningtotherecapofhowhiscrewsavedthemenfromacapsizedvessel.
正则表达式:
\bcap
结果:
Thecaptainworehiscapandcapeproundlyashesatlisteningtotherecapofhowhiscrewsavedthemenfromacapsizedvessel.
模式\bcat将