正则表达式.docx
《正则表达式.docx》由会员分享,可在线阅读,更多相关《正则表达式.docx(22页珍藏版)》请在冰点文库上搜索。
正则表达式
中正则表达式使用
(一)http:
//www.S
2008/10/2300:
09
一、限定符:
限定符提供了一种简单方法,用于指定允许特定字符或字符集自身重复出现的次数。
限定符始终引用限定符前(左边)的模式,通常是单个字符,除非使用括号创建模式组。
(一)非显示限定符
1、
*,描述“出现0或多次”。
2、
+,描述“出现1或多次”。
3、
?
,描述“出现0或1次”。
(二)显式限定符
显式限定符使用花括号{n,m}及其中的数字值表示模式出现次数的上下限。
如果仅指定一个数字,则表示次数上限,例如,x{5}将准确匹配5个x字符(xxxxx),如果数字后跟一个逗号,如x{5,},表示匹配任何出现次数大于4的x字符。
二、元字符
.(句点或点)元字符是最简单但最常用的一个字符。
它可匹配任何单字符。
如果要指定某些模式可包含任意组合的字符,使用句点非常有用,但一定要在特定长度范围内。
^元字符可指定字符串(或行)的开始。
$元字符可指定字符串(或行)的结束。
通过将这些字符添加到模式的开始和结束处,可强制模式仅匹配精确匹配的输入字符串。
如果^元字符用在方括号[]指定的字符类的开头,将有特殊的含义。
具体内容后。
\(反斜杠)元字符既可根据特殊含义“转义”字符,也可指定预定义集合元字符的实例。
同样,具体内容见下。
为了在正则表达式中包括文字样式的元字符,必须使用反斜杠进行“转义”。
例如,如果要匹配以“c:
\”开始的字符串,可使用:
^c:
\\。
注意,要使用^元字符指出字符串必须以此模式作为开始,然后用反斜杠元字符转义文字反斜杠。
|(管道)元字符用于交替指定,特别用于在模式中指定“此或彼”。
例如,a|b将匹配包含“a”或“b”的任何输入内容,这与字符类[ab]非常类似。
()括号用于给模式分组。
它允许使用限定符让一个完整模式出现多次。
为了便于阅读,或分开匹配特定的输入部分,可能允许分析或重新设置格式。
三、字符类:
字符类是正则表达式中的“迷你”语言,在方括号[]中定义。
在表达式中使用字符类时,可在模式的此位置使用其中任何一个字符(但只能使用一个字符,除非使用了限定符)。
请注意,不能使用字符类定义单词或模式,只能定义单个字符。
通过在括号中使用连字符-来定义字符的范围。
连字符在字符类中有特殊的含义(不是在正则表达式中,因此,准确地说它不能叫正则表达式元字符),且仅在连字符不是第一个字符时,连字符才在字符类中有特殊含义。
要使用连字符指定任何数值数字,可以使用[0-9]。
小写字母也一样,可以使用[a-z],大写字母可以使用[a-z]。
连字符定义的范围取决于使用的字符集。
因此,字符在(例如)ascii或unicode表中出现的顺序确定了在范围中包括的字符。
如果需要在范围中包括连字符,将它指定为第一个字符。
例如:
[-.?
]将匹配4个字符中任何一个字符(注意,最后的字符是个空格)。
另请注意,正则表达式元字符在字符类中不做特殊处理,所以这些元字符不需要转义。
考虑到字符类是与其他正则表达式语言分开的一种语言,因此字符类有自己的规则和语法。
如果使用字符^作为字符类的第一个字符来否定此类,也可以匹配字符类成员以外的任何字符。
因此,要匹配任何非元音字符,可以使用字符类[^aaeeiioouu]。
注意,如果要否定连字符,应将连字符作为字符类的第二个字符,如[^-]。
记住,^在字符类中的作用与它在正则表达式模式中的作用完全不同。
四、预定义的集合元字符
元字符
等效字符类
\a
匹配铃声(警报);\u0007
\b
匹配字符类外的字边界,它匹配退格字符,\u0008
\t
匹配制表符,\u0009
\r
匹配回车符,\u000d
\w
匹配垂直制表符,\u000b
\f
匹配换页符,\u000c
\n
匹配新行,\u000a
\e
匹配转义符,\u001b
\040
匹配3位8进制ascii字符。
\040表示空格(十进制数32)。
\x20
使用2位16进制数匹配ascii字符。
此例中,\x2-表示空格。
\cc
匹配ascii控制字符,此例中是ctrl-c。
\u0020
使用4位16进制数匹配unicode字符。
此例中\u0020是空格。
\*
不代表预定义字符类的任意字符都只作为该字符本身对待。
因此,\*等同于\x2a(是文字*,不是*元字符)。
\p{name}
匹配已命名字符类“name”中的任意字符。
支持名称是unicode组和块范围。
例如,ll、nd、z、isgreek、isboxdrawing和sc(货币)。
\p{name}
匹配已命名字符类“name”中不包括的文本。
\w
匹配任意单词字符。
对于非unicode和ecmascript实现,这等同于[a-za-z_0-9]。
在unicode类别中,这等同于[\p{ll}\p{lu}\p{lt}\p{lo}\p{nd}\p{pc}]。
\w
\w的否定,等效于ecmascript兼容集合[^a-za-z_0-9]或unicode字符类别[^\p{ll}\p{lu}\p{lt}\p{lo}\p{nd}\p{pc}]。
\s
匹配任意空白区域字符。
等效于unicode字符类[\f\n\r\t\v\x85\p{z}]。
如果使用ecmascript选项指定ecmascript兼容方式,\s等效于[\f\n\r\t\v](请注意前导空格)。
\S
匹配任意非空白区域字符。
等效于unicode字符类别[^\f\n\r\t\v\x85\p{z}]。
如果使用ecmascript选项指定ecmascript兼容方式,\s等效于[^\f\n\r\t\v](请注意^后的空格)。
\d
匹配任意十进制数字。
在ecmascript方式下,等效于unicode的[\p{nd}]、非unicode的[0-9]。
\d
匹配任意非十进制数字。
在ecmascript方式下,等效于unicode的[\p{nd}]、非unicode的[^0-9]。
五、中建立和使用RegularexPressions类(见《中正则表达式使用
(二)》
中正则表达式使用
(一)
Regex
Regex
Regex类表示不可变(只读)正则表达式类。
它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类。
以下代码示例创建了Regex类的实例并在初始化对象时定义一个简单的正则表达式。
请注意,使用了附加的反斜杠作为转义字符,它将\s匹配字符类中的反斜杠指定为原义字符。
[VisualBasic]
'DeclareobjectvariableoftypeRegex.
DimrAsRegex
'CreateaRegexobjectanddefineitsregularexpression.
r=NewRegex("\s2000")
[C#]
//DeclareobjectvariableoftypeRegex.
Regexr;
//CreateaRegexobjectanddefineitsregularexpression.
r=newRegex("\\s2000");
Match
Match类表示正则表达式匹配操作的结果。
以下示例使用Regex类的Match方法返回Match类型的对象,以便找到输入字符串中的第一个匹配项。
此示例使用Match类的Match.Success属性来指示是否已找到匹配。
[VisualBasic]
'cCreateanewRegexobject.
DimrAsNewRegex("abc")
'Findasinglematchintheinputstring.
DimmAsMatch=r.Match("123abc456")
Ifm.SuccessThen
'Printoutthecharacterpositionwhereamatchwasfound.
'(Characterposition3inthiscase.)
Console.WriteLine("Foundmatchatposition"&m.Index.ToString())
EndIf
[C#]
//CreateanewRegexobject.
Regexr=newRegex("abc");
//Findasinglematchinthestring.
Matchm=r.Match("123abc456");
if(m.Success)
{
//Printoutthecharacterpositionwhereamatchwasfound.
//(Characterposition3inthiscase.)
Console.WriteLine("Foundmatchatposition"+m.Index);
}
MatchCollection
MatchCollection类表示成功的非重叠匹配的序列。
该集合为不可变(只读)的,并且没有公共构造函数。
MatchCollection的实例是由Regex.Matches属性返回的。
以下示例使用Regex类的Matches方法,通过在输入字符串中找到的所有匹配填充MatchCollection。
该示例将此集合复制到一个字符串数组和一个整数数组中,其中字符串数组用以保存每个匹配项,整数数组用以指示每个匹配项的位置。
[VisualBasic]
DimmcAsMatchCollection
Dimresults(20)AsString
Dimmatchposition(20)AsInteger
'CreateanewRegexobjectanddefinetheregularexpression.
DimrAsNewRegex("abc")
'UsetheMatchesmethodtofindallmatchesintheinputstring.
mc=r.Matches("123abc4abcd")
'Loopthroughthematchcollectiontoretrieveall
'matchesandpositions.
DimiAsInteger
Fori=0Tomc.Count-1
'Addthematchstringtothestringarray.
results(i)=mc(i).Value
'Recordthecharacterpositionwherethematchwasfound.
matchposition(i)=mc(i).Index
Nexti
[C#]
MatchCollectionmc;
String[]results=newString[20];
int[]matchposition=newint[20];
//CreateanewRegexobjectanddefinetheregularexpression.
Regexr=newRegex("abc");
//UsetheMatchesmethodtofindallmatchesintheinputstring.
mc=r.Matches("123abc4abcd");
//Loopthroughthematchcollectiontoretrieveall
//matchesandpositions.
for(inti=0;i{
//Addthematchstringtothestringarray.
results[i]=mc[i].Value;
//Recordthecharacterpositionwherethematchwasfound.
matchposition[i]=mc[i].Index;
}
GroupCollection
GroupCollection类表示捕获的组的集合并返回单个匹配中捕获的组的集合。
该集合为不可变(只读)的,并且没有公共构造函数。
GroupCollection的实例在Match.Groups属性返回的集合中返回。
以下控制台应用程序示例查找并输出由正则表达式捕获的组的数目。
有关如何提取组集合的每一成员中的各个捕获项的示例,请参见下面一节的CaptureCollection示例。
[VisualBasic]
ImportsSystem
ImportsSystem.Text.RegularExpressions
PublicClassRegexTest
PublicSharedSubRunTest()
'Definegroups"abc","ab",and"b".
DimrAsNewRegex("(a(b))c")
DimmAsMatch=r.Match("abdabc")
Console.WriteLine("Numberofgroupsfound="_
&m.Groups.Count.ToString())
EndSub
PublicSharedSubMain()
RunTest()
EndSub
EndClass
[C#]
usingSystem;
usingSystem.Text.RegularExpressions;
publicclassRegexTest
{
publicstaticvoidRunTest()
{
//Definegroups"abc","ab",and"b".
Regexr=newRegex("(a(b))c");
Matchm=r.Match("abdabc");
Console.WriteLine("Numberofgroupsfound="+m.Groups.Count);
}
publicstaticvoidMain()
{
RunTest();
}
}
该示例产生下面的输出。
[VisualBasic]
Numberofgroupsfound=3
[C#]
Numberofgroupsfound=3
CaptureCollection
CaptureCollection类表示捕获的子字符串的序列,并且返回由单个捕获组执行的捕获的集合。
由于限定符,捕获组可以在单个匹配中捕获多个字符串。
Captures属性(CaptureCollection类的对象)是作为Match和group类的成员提供的,以便于对捕获的子字符串的集合的访问。
例如,如果使用正则表达式((a(b))c)+(其中+限定符指定一个或多个匹配)从字符串“abcabcabc”中捕获匹配,则子字符串的每一匹配的Group的CaptureCollection将包含三个成员。
以下控制台应用程序示例使用正则表达式(Abc)+来查找字符串“XYZAbcAbcAbcXYZAbcAb”中的一个或多个匹配。
该示例阐释了使用Captures属性来返回多组捕获的子字符串。
[VisualBasic]
ImportsSystem
ImportsSystem.Text.RegularExpressions
PublicClassRegexTest
PublicSharedSubRunTest()
DimcounterAsInteger
DimmAsMatch
DimccAsCaptureCollection
DimgcAsGroupCollection
'Lookforgroupingsof"Abc".
DimrAsNewRegex("(Abc)+")
'Definethestringtosearch.
m=r.Match("XYZAbcAbcAbcXYZAbcAb")
gc=m.Groups
'Printthenumberofgroups.
Console.WriteLine("Capturedgroups="&gc.Count.ToString())
'Loopthrougheachgroup.
Dimi,iiAsInteger
Fori=0Togc.Count-1
cc=gc(i).Captures
counter=cc.Count
'Printnumberofcapturesinthisgroup.
Console.WriteLine("Capturescount="&counter.ToString())
'Loopthrougheachcaptureingroup.
Forii=0Tocounter-1
'Printcaptureandposition.
Console.WriteLine(cc(ii).ToString()_
&"Startsatcharacter"&cc(ii).Index.ToString())
Nextii
Nexti
EndSub
PublicSharedSubMain()
RunTest()
EndSub
EndClass
[C#]
usingSystem;
usingSystem.Text.RegularExpressions;
publicclassRegexTest
{
publicstaticvoidRunTest()
{
intcounter;
Matchm;
CaptureCollectioncc;
GroupCollectiongc;
//Lookforgroupingsof"Abc".
Regexr=newRegex("(Abc)+");
//Definethestringtosearch.
m=r.Match("XYZAbcAbcAbcXYZAbcAb");
gc=m.Groups;
//Printthenumberofgroups.
Console.WriteLine("Capturedgroups="+gc.Count.ToString());
//Loopthrougheachgroup.
for(inti=0;i{
cc=gc[i].Captures;
counter=cc.Count;
//Printnumberofcapturesinthisgroup.
Console.WriteLine("Capturescount="+counter.ToString());
//Loopthrougheachcaptureingroup.
for(intii=0;ii{
//Printcaptureandposition.
Console.WriteLine(cc[ii]+"Startsatcharacter"+
cc[ii].Index);
}
}
}
publicstaticvoidMain(){
RunTest();
}
}
此示例返回下面的输出结果。
[VisualBasic]
Capturedgroups=2
Capturescount=1
AbcAbcAbcStartsatcharacter3
Capturescount=3
AbcStartsatcharacter3
AbcStartsatcharacter6
AbcStartsatcharacter9
[C#]
Capturedgroups=2
Capturescount=1
AbcAbcAbcStartsatcharacter3
Capturescount=3
AbcStartsatcharacter3
AbcStartsatcharacter6
AbcStartsatcharacter9
Group
group类表示来自单个捕获组的结果。
因为Group可以在单个匹配中捕获零个、一个或更多的字符串(使用限定符),所以它包含Capture对象的集合。
因为Group继承自Capture,所以可以直接访问最后捕获的子字符串(Group实例本身等价于Captures属性返回的集合的最后一项)。
Group的实例是由Match.Groups(groupnum)属性返回的,或者在使用“(?
)”分组构造的情况下,是由Match.Groups("groupname")属性返回的。
以下代码示例使用嵌套的分组构造来将子字符串捕获到组中。
[VisualBasic]
Dimmatchposition(20)AsInteger
Dimresults(20)AsString
'Definesubstringsabc,ab,b.
DimrAsNewRegex("(a(b))c")
DimmAsMatch=r.Match("abdabc")
DimiAsInteger=0
WhileNot(m.Groups(i).Value="")
'Copygroupstostringarray.
results(i)=m.Groups(i).Value
'Recor