|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在VC.net的版本上,为了让C++运行在.NETFramework中,微软为C++引进了托管,就是托管C++(ManagedC++),这个根本就没有流行起来,自托管C++产生以后就没有收到过好评。正则表达式是处置字符串的经常使用工具。在C#中,我们一样平常利用Regex类来暗示一个正则表达式。一样平常正则表达式引擎撑持以下3种婚配形式:单行形式(Singleline)、多行形式(Multiline)与疏忽巨细写(IgnoreCase)。
1.单行形式(Singleline)
MSDN界说:变动点(.)的寄义,使它与每个字符婚配(而不是与除
以外的每一个字符婚配)。
利用单行形式的典范场景是猎取网页源码中的信息。
示例:
我们利用WebBrowser控件,从http://www.xxx.com/1.htm上猎取了以下HTML源码,它存储在变量str中:
<html>
<body>
<div>
Line1
Line2
</div>
</body>
</html>
我们想把div标签和个中的内容提掏出来,编写代码以下:
stringpattern=@"<div>.*</div>";
Regexregex=newRegex(pattern);
if(regex.IsMatch(str))
Console.WriteLine(regex.Match(str).Value);
else
Console.WriteLine("Mismatch!");
//了局为:Mismatch!
毛病剖析:
一样平常以为点标记(.)是婚配恣意单个字符的,而(.*)就是婚配恣意多个字符。但实践上点标记不克不及婚配换行符。在Windows中与它等效的表达式为[^
]。
而我们从网站上猎取的HTML源码,少少有不换行的。这时候候单行形式派上用处了,它能够改动点标记的意义。修正regex实例的机关函数,用RegexOptions.Singleline来声明利用单行形式:
stringpattern=@"<div>.*</div>";
Regexregex=newRegex(pattern,RegexOptions.Singleline);
if(regex.IsMatch(str))
Console.WriteLine(regex.Match(str).Value);
else
Console.WriteLine("Mismatch!");
/*
了局为:
<div>
Line1
Line2
</div>
*/
单行形式的嵌进润色符:
我们能够间接在正则表达式中嵌进单行形式:
(?s)<div>.*</div>
(?s)润色符申明,厥后面的表达式接纳单行形式。以是利用时请不要将它放在开端。别的可使用(?-s)封闭单行形式。
注重:嵌进形式的优先级要高于Regex类的RegexOptions设置,以是利用了(?s)后,不管是不是利用RegexOptions.Singleline,均依照单行形式剖析。
2.多行形式(Multiline)
MSDN界说:变动^和$的寄义,使它们分离在恣意一行的行首和行尾婚配,而不单单在全部字符串的开首和开头婚配。
示例:
有一个文本文件,它的每行是一个用户名,将文件读进变量str中举行处置。其内容以下:
二十四画生
TerryLee
莫相会
DflyingChen
Rainy
借用博客园列位先辈的台甫:)
我们想找出一个利用英笔墨母开首的用户名,编写代码以下:
stringpattern=@"^[A-Za-z]+.*";
Regexregex=newRegex(pattern);
if(regex.IsMatch(str))
Console.WriteLine(regex.Match(str).Value);
else
Console.WriteLine("Mismatch!");
//了局为:Mismatch!
毛病剖析:
(^)是字符串的肇端锚定,str的第一个字符是一其中笔墨,以是婚配不上。我们就能够利用多行形式来改动(^)的寄义,使它婚配每行的肇端,而不是全部字符串的肇端。
变动代码以下:
stringpattern=@"^[A-Za-z]+.*";
Regexregex=newRegex(pattern,RegexOptions.Multiline);
if(regex.IsMatch(str))
Console.WriteLine(regex.Match(str).Value);
else
Console.WriteLine("Mismatch!");
//了局为:TerryLee
同时,多行形式也会改动($)的寄义,使它婚配每行的开头,而不是全部字符串的开头。
与(^)和($)分歧的是,(A)和()其实不受多行形式的影响,永久婚配全部字符串的肇端和开头。
多行形式的嵌进润色符:(?m)与(?-m)
3.疏忽巨细写(IgnoreCase)
MSDN界说:指定不辨别巨细写的婚配。
这个形式很简单了解,它以为巨细写字符是不异的。我们仍以上例来讲明。
示例:
stringpattern=@"^[a-z]+.*";
Regexregex=newRegex(pattern,RegexOptions.Multiline|RegexOptions.IgnoreCase);
if(regex.IsMatch(str))
Console.WriteLine(regex.Match(str).Value);
else
Console.WriteLine("Mismatch!");
//了局为:TerryLee
剖析:请注重此次利用的正则表达式,我们并没有写进年夜写字母,但却婚配了以年夜写字母开首的名字,这就是疏忽巨细写的效果。
疏忽巨细写的嵌进润色符:(?i)与(?-i)
总结:
最初我们用一个表格来总结一下这三个形式
界说影响的表达式RegexOptions列举嵌进标识符
单行形式变动点(.)的寄义,使它与每个字符婚配(而不是与除
以外的每一个字符婚配)。.Singleline(?s)
多行形式变动^和$的寄义,使它们分离在恣意一行的行首和行尾婚配,而不单单在全部字符串的开首和开头婚配。^$Multiline(?m)
疏忽巨细写指定不辨别巨细写的婚配。IgnoreCase(?i)
语言是不是不是最重要的? |
|