由于客户的需求,我今天第一次学习使用了正则表达式。下面把握的心得写书来跟大家分享。
早期起源
正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。
1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。
随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。
如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。
正则表达式都能干什么
在典型的搜索和替换操作中,必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了,但是由于它缺乏灵活性,因此在搜索动态文本时就有困难了,甚至是不可能的。
使用正则表达式,就可以:
测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。
一些语法定义
\S :匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\d :匹配一个数字字符。等价于 [0-9]。
(pattern ) :匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在 JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
\. :转义字符,其实就是在匹配“.“。
. :匹配除换行符 \n之外的任何单字符。
+ :匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
我遇到的问题
客户跑过来对我说,你看你们想数据库里面存储数据的时候把我打的利率后面的千分号都没存进去。
.......我冤哪!我有不是非要把你的千分号不往里面存,是你自己打字的时候有问题。呜呜!不过客户有需求我们就要满足,没有条件满足制造条件也要满足。于是我想到了正则表达式。
解决方法
原始字符串:
"条件符合,讨论意见被通过。fwerfweqfewfverwfewrfwefwefsvdfsa利率abc4.02369huh7437ghrfbvyue"
现在要将上面字符串里面的数字”4.02369”替换成”4.02369‰”。
分析这个句子,我们发现该数字出现的位置是固定的,在利率后面出现的第一个小数就是了。所以依照这个方法创建正则表达式为:“利率\S+(\d\.\d+)”
具体的程序代码如下:
using System.Text.RegularExpression;
private string RegexRep()
{
string ss = "条件符合,讨论意见被通过。fwerfweqfewfverwfewrfwefwefsvdfsa利率abc4.02369huh7437ghrfbvyue";
string exp = @"利率\S+(\d\.\d+)";//这串正则表达式匹配的就是字符串ss中的“利率abc4.02369”一段话。
Regex r = new Regex(exp,RegexOptions.IgnoreCase);
string a = Regex.Replace(ss,exp,new MatchEvaluator(this.myMatch));
return(a);
}
private string myMatch(Match m)
{
string x = m.ToString();
return x + "%";//将字符串结尾加一个千分号然后返回
}
//此代码在VisualStudio.NET调试通过。
其中更详细的方法调用的参数解释请大家参照MSDN
.NetDevelopment->.NetFrameWork->Reference->Class Library->System.Text.RegularExpression
结论
至此问题圆满解决,不过最后我们还是说服用户不采纳这种解决方法。因为,呵呵,谁知道哪天用户心血来潮会在文本框里面输入什么东西呢!万一匹配错误,我们就是跳进黄河里面也洗不清呀!