正则表达式的编程

正则表达式的编程

一直以来,很多编程语言和工具它们对正则表达式都是支持的,可以说正则表达式它是一门灵活性非常强的语言,不同的开发人员匹配相同的字符串却能够得到不一样结果,是不是很神奇。正则表达式的用处有很多,例如我们可以使用正则表达式去限制网页表单里的文本框输入内容,也可以利用正则表达式分解和转换IP地址,

在日常中,正则表达式就是编程者“常学常忘“的知识之一,用的时候就去查看相关的资料,不用就忘得一干二净,有些时候正则表达式能够迅速处理大部分情况,但是一些复杂的情况处理效率还是不够快,毕竟没有哪一样东西是完美无缺的,

首先我去了解一下C#里面有关正则表达式的类,在.Net中提供了对正则表达式的支持,,C#中的正则表达式包含在.NET基础雷库的一个名称空间下,这个名称空间就是

System.Text.RegularExpressions。该名称空间包括8个类,1个枚举,1个委托。
Capture: 包含一次匹配的结果; 
                 CaptureCollection: Capture的序列; 
                 Group: 一次组记录的结果,由Capture继承而来; 
                 GroupCollection:表示捕获组的集合
                 Match: 一次表达式的匹配结果,由Group继承而来; 
                 MatchCollection: Match的一个序列; 
                 MatchEvaluator: 执行替换操作时使用的委托; 
                 Regex:编译后的表达式的实例。 
                 RegexCompilationInfo:提供编译器用于将正则表达式编译为独立程序集的信息
                 RegexOptions 提供用于设置正则表达式的枚举值

虽然在C#中有关正则表达式的类不是很多,但是对于正则表达式的初学者来说还是很容易弄混的,所以出现不知道该用哪些类的哪些方法或者属性的情况,

我们先从使用Regex、Match类的简单表达式开始学习。了解一下.NET中有关正则表达式的类和它们之间的关系是有必要的,关于它们两之间的关系如下:
Regex:正则表达式类,代表了一个不可变的正则表达式
Match:代表了Regex类的实例的一次匹配结果,可以通过Regex的Match()实例方法返回一个Match的实例。

对于正则表达式的应用,基本可以分为验证、提取、分割和替换,而这些只要使用Regex就可以实现验证和简单的替换。

声明一个Regex对象变量:Regex str;,接着创建Regex对象的一个实例,并定义其规则:str = new Regex("[^a-zA-Z]");

利用正则表达式Regex类实现验证
现在有很多有反馈性的网站和论坛对一些敏感词进行了过滤,只要含有这类的敏感词的文章都会被禁止发表或者被替换,而这一个操作都是使用Regex类进行实现的,举个例子给演示:

public void IsMatchDemo() 
{ string game= "甄姬、王昭君、后羿、法师、孙尚香、李白"; 
 	 Regex regex = new Regex("法师"); 
 	 
			if(Regex.IsMatch(game, "法师"))
	Console.WriteLine("字符串中包含有敏感词: 法师!");
 } 

输出结果:字符串中包含有敏感词: 法师!
在上面的例子里面,检查的字符串中含有“法师”这个关键词就会在控制台上输出提示,当然在实际的应用中可能是包含有被禁止的词语的内容不允许提交而不是仅仅提示了。
(注意:但是想这种情况还是有办法绕过,换种书写方式“法-师”或“法+师”来替换法师就可以绕过验证了。)

使用Regex类进行替换
上面的处理值是查看提交的内容中是否含有被禁止的关键词,其实有时候还可以做到将被禁止的关键词进行替换,例如将上面用到的字符串中的任何形式的"、“替换成”|",(RegexOptions.IgnoreCase表示匹配字符串的时候不管大小写是否一致)下面就是一个例子:

public void Replace() 
{ string game= "甄姬、王昭君、后羿、法师、孙尚香、李白"; 
  Regex regex = new Regex("、"RegexOptions.IgnoreCase); 
		string game1=regex.Replace(source, "-");
Console.WriteLine("原始字符串:" + game);
	Console.WriteLine("替换后的字符串:" + game1);
 } 

输出结果:
原始字符串:甄姬、王昭君、后羿、法师、孙尚香、李白
替换后的字符串:甄姬-王昭君-后羿-法师-孙尚香-李白

Regex类中还包含一些静态的方法:
Escape: 对字符串中的regex中的转义符进行转义;Escape方法表示把转义字符作为字符本身使用,而不再具有转义作用,最小的元字符集(\、*、+、?、|、{、[、(、)、^、$、.、# 和空白)。

IsMatch: 如果表达式在字符串中匹配,该方法返回一个布尔值;IsMatch方法指示 Regex 构造函数中指定的正则表达式在输入字符串中是否找到匹配项。这是我们使用C#正则表达式时最常用的方法之一。

Match: 返回Match的实例;Match方法是在输入字符串中搜索正则表达式的匹配项,并Regex 类的 Match 方法返回 Match 对象,Match 类表示正则表达式匹配操作的结果。
Matches: 返回一系列的Match的方法;

Replace: 用替换字符串替换匹配的表达式;Replace方法则是用指定的替换字符串替换由正则表达式定义的字符模式的所有匹配项。

Split: 返回一系列由表达式决定的字符串;Split方法是把由正则表达式匹配项定义的位置将输入字符串拆分为一个子字符串数组。看上去和String的Split方法一样,但string的Split方法在由正则表达式而不是一组字符确定的分隔符处拆分字符串。

Unescape: 不对字符串中的转义字符转义。
在上面说过正则表达式是一门灵活性非常强的语言,它还提供了处理文本的功能强大又高效率的方法。它的全面匹配表示法使您可以快速分析大量文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串。正则表达式语言是有两种基本字符类型组成,原义(正常)文本字符和元字符。
元字符使正则表达式具有处理能力,但是元字符只是针对单个字符匹配,如果想要匹配更多的字符,还要借助限定符。(关于元字符和限定符在上一章内容里面我已经简单描述过了,想要了解的可以返回上一章查看),

在正则表达式中有些符号已经具有一定特殊意义,例如“\”、“?”、“*”、“^”、“$”、“+”、“(”、“)”、“|”、“{”、“[”等字符,如果需要用它们的原始意义,对它进行转义就可以了,转义符为”\”。例如在字符串中匹配“+”,那么正则表达式应该这么写:\+。
可以将多个元字符或者原义文本字符用括号括 起来形成一个分组;(将正则表达式的一部分用小括号()包起来时可以形成一个分组的,这种分组也称一个子匹配或一个捕获组);
基于过程和基于表达式方法的比较

一般情况下,使用规则表达式的用户可以分为以下二大类:第一类用户尽量不使用规则表达式,而是使用过程来执行一些需要重复的操作;第二类用户则充分利用规则表达式处理引擎的功能和威力,而尽可能少地使用过程。 对于我们大多数用户而言,最好的方案莫过于二者兼而用之了,
基于过程的模式
  我们在编程中经常需要用到的一个功能是对字符串中的一部分进行匹配或其他一些对字符串处理,下面是一个对字符串中的单词进行匹配的例子:
  
string text = “the quick red fox jumped over the lazy brown dog.”;
System.Console.WriteLine(“text=[” + text + “]”);
string result = “”;
string pattern = @"\w+|\W+";

foreach (Match m in Regex.Matches(text, pattern))
{// 取得匹配的字符串
string x = m.ToString();
// 如果第一个字符是小写
if (char.IsLower(x[0]))
// 变成大写
   x = char.ToUpper(x[0]) + x.Substring(1, x.Length-1);
// 收集所有的字符
  result += x;
}
System.Console.WriteLine(“result=[” + result + “]”);

基于表达式的模式
完成上例中的功能的另一条途径是通过一个MatchEvaluator,新的代码如下所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值