正则表达式.docx

上传人:b****6 文档编号:13398720 上传时间:2023-06-13 格式:DOCX 页数:22 大小:23.68KB
下载 相关 举报
正则表达式.docx_第1页
第1页 / 共22页
正则表达式.docx_第2页
第2页 / 共22页
正则表达式.docx_第3页
第3页 / 共22页
正则表达式.docx_第4页
第4页 / 共22页
正则表达式.docx_第5页
第5页 / 共22页
正则表达式.docx_第6页
第6页 / 共22页
正则表达式.docx_第7页
第7页 / 共22页
正则表达式.docx_第8页
第8页 / 共22页
正则表达式.docx_第9页
第9页 / 共22页
正则表达式.docx_第10页
第10页 / 共22页
正则表达式.docx_第11页
第11页 / 共22页
正则表达式.docx_第12页
第12页 / 共22页
正则表达式.docx_第13页
第13页 / 共22页
正则表达式.docx_第14页
第14页 / 共22页
正则表达式.docx_第15页
第15页 / 共22页
正则表达式.docx_第16页
第16页 / 共22页
正则表达式.docx_第17页
第17页 / 共22页
正则表达式.docx_第18页
第18页 / 共22页
正则表达式.docx_第19页
第19页 / 共22页
正则表达式.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

正则表达式.docx

《正则表达式.docx》由会员分享,可在线阅读,更多相关《正则表达式.docx(22页珍藏版)》请在冰点文库上搜索。

正则表达式.docx

正则表达式

中正则表达式使用

(一)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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 成人教育 > 自考

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2