如果还不知道什么是正则表达式建议看看这篇文章-30分钟入门正则表达式,讲的很详细 http://deerchao.net/tutorials/regex/regex.htm
本文假设你已经有了一些正则表达式的基础,如果你能跟着做下来相信你对C#中正则的使用也就基本会用了,更多需要的是实践和自己的灵活运用
.NET中的正则表达式位于System.Text.RegularExpressions命名空间中
用到比较多的是这几个类 Regex Match MacthCollection Group GroupCollection
以下用一个实例演示通过这几个类相互间的交互在.NET中应用正则表达式....
设置操作字符串string str = "994677767-XXX";
首先创建一个Regex对象
Regex regex=new Regex(@"(\d{5,9})-(\w+)");
用Regex对象的Match方法去匹配一个字符串,用Value属性得到匹配的值
Console.WriteLine(regex.Match(str).Value); //输出994677767-XXX
这里Match方法提供了3种重载
regex.Match(strString),
regex.Match(strString,offSet)
regex.Match(strString,offSet,maxlength);
strString=要匹配的字符串,offSet=开始匹配的位置(int),maxlength=字符串要匹配的长度
regex.Match(str)返回一个Macth类型的对象
我们可以这样写
Regex regex=new Regex(@"(\d{5,9})-(\w+)");
Match match = regex.Match(str);
Console.WriteLine(match.Value);
Match对象有很多属性和方法,例如.Success返回Bool类型值判断匹配是否成功,.Value返回匹配到的结果,.Length属性,匹配文本的长度...
细心的同学应该也注意到了我们的表达式@"(\d{5,9})-(\w+)"用了俩个()即分组
Match对象可以得到分组捕获的内容
Regex regex=new Regex(@"(\d{5,9})-(\w+)");
Match match = regex.Match(str);
Console.WriteLine(match.Groups[1].Value); //输出994677767
这里用到了Group[1],其实返回的是一个Group对象
我们进一步变形
Regex regex = new Regex(@"(\d{5,9})-(\w+)");
Match match = regex.Match(str);
Group group = match.Groups[1];
Console.WriteLine(group.Value); //输出994677767
Group和Match对象的属性方法差不多这里不在说明
也许有的人会疑问为什么不是XXX
这是因为match.Groups得到的是一个Group对象的集合
集合中的第一个对象match.Groups[0].Value得到的是匹配到的文本内容和match.Value的值是一样的
我们的分组是号是从1开始的,所以match.Groups[1].Value输出994677767
我们输出match.Groups.Count将得到3
到这里相信到家对这几个类的使用有些熟悉了 我们进一步扩展
如果我们的操作字符串类似这样string str = "994677767-XXX 615050000-小Q";
如何取出每一个符合条件的,这里用到了Matches方法返回一个Match对象的集合MatchCollection
string str = "994677767-XXX 615050000-小Q";
Regex regex = new Regex(@"(\d{5,9})-(\w+)");
MatchCollection match = regex.Matches(str);
Console.WriteLine(match.Count);
foreach (Match item in match)
{
Console.WriteLine(item.Value);
}
//结果输出
2
994677767-XXX
615050000-小Q
下面给大家讲一下.NET中Replace的使用
string str = "994677767-XXX 615050000-小Q";
Regex regex = new Regex(@"(\d{5,9})-(\w+)");
regex.Replace提供了6种重载,这里只讲俩种
regex.Replace(strString,replacement); //strString=要被替换的那个字符串,replacement=用来替换的字符串
Regex regex = new Regex(@"(\d{5,9})-(\w+)");
string output = regex.Replace(str, "AAAAAAA");
Console.WriteLine(output); //输出AAAAAAA AAAAAAA
这输出的都是一样的不够灵活
Replace方法并不会修改原始字符串只是返回操作后的字符串
Replace方法允许你传入委托,执行你想要的操作,例如这里应用了一个委托把匹配的每一个中有XXX的替换掉
//首先定义一个静态的处理方法
public static string MatchFun(Match match)
{
return match.Value.Replace("XXX", "###");
}
//定义一个委托,传入我们创建的处理方法
MatchEvaluator matchEvaluator = new MatchEvaluator(MatchFun);
string str = "994677767-XXX 615050000-小Q";
Regex regex = new Regex(@"(\d{5,9})-(\w+)");
string output = regex.Replace(str, matchEvaluator);//传入创建的委托对象
Console.WriteLine(output); //输出994677767-### 615050000-小Q
Split方法 这里给出一个示例
string str = "994677767-XXX,615050000-小Q、121312-aaa";
Regex regex = new Regex(@"[,、]");
string[] output = regex.Split(str);
for (int i = 0; i < output.Length; i++) { Console.WriteLine(output[i]); }
关于Regex类
Regex的创建可以传入RegexOptions设置选项
例如Regex regex=new Regex(@"\d",RegexOptions.IgnoreCase|RegexOptions.Complied);
RegexOptions.IgnoreCase表示匹配的文本忽略大小写
RegexOptions.Complied表示编译正则表达式,编译后在以后的匹配速度会快些,如果仅用一次那么就没有必要了.
类似的还有RegexOptions.RightToLeft,RegexOptions.Singleline...相信大家都知道是什么意思
多个选项设置用|分开
Regex同时也提供了很多静态的方法,例如
Regex.IsMatch()
查找字符串中是否有数字,有的话返回True
string str = "994677767-XXX";
Console.WriteLine(Regex.IsMatch(str, @"\d")); //输出True
Regex.Matches()
Regex.Replace()
Regex.Split()
在实例中也都存在相应的静态方法,用法基本一样
更多详细内容可以参考原文地址http://blog.csdn.net/MicrosoftCompany/archive/2009/06/06/4248222.aspx