C#中的正则表达式
Jeffrey E.F. Friedl写了一本关于正则表达式的书《精通正则表达式》。作者为了使读者更好的理解和掌握正则表达式,编造了一个故事。该书的语言以perl为主。据我所知C#中的正则表达式也是基于perl5。所以它们应该有许多的共同之处。
其实,我并不打算原封不动的对该书的内容进行翻译,一则这本书内容太多了,我根本就不胜任翻译这项工作;二则如果我真的把这本书翻译过来,同时把里面的代码换成C#,在没有征得原作者的情况下,可能有侵权的嫌疑了。所以,权当作读书笔记好了。
略过冗长的前言,我们可以直接进入第一章:
介绍正则表达式
作者说这一章是为正则表达式的绝对菜鸟而准备的,目的是为以后的章节打下坚实的基础。那么如果你是不是菜鸟,你可以忽略这一章。
故事场景:
你的档案部的头儿想要一个工具用来检查重复的单词(如:this this),一个在大量编辑文档的时候通常会遇到的问题。你的工作就是创建一个解决方案:
接受任何数量要检查的文件,报告每个文件中带有重复单词的那些行,突出显示这些重复的单词,同时确保原文件名称和这些行出现在报表中。
跨行检查,找到一行的最后一个单词和下一行开头第一个单词出现重复的情况。
找出重复的单词,不管他们是否大小写不同(如:The the),以及允许在这些重复单词之间含有不同数量的空白字符(空格、制表符、新行等)
找出重复的单词,甚至这些单词被Html标签隔开。(如:…it is <B>very</B> very important.)
要解决上述的实际问题,我们首先要做的就是写出正则表达式,找到我们想要的文本,忽略我们不需要的文本,然后使用我们的C#代码对获取的文本进行处理。
在使用正则表达式之前,你也许多少已经知道什么是正则表达式。甚至你不知道,你几乎可以肯定已经熟悉它的基本概念了。
你知道report.txt是一个具体的文件名称,但是如果你有任何Unix或者DOS/Windows的经验,你也知道“*.txt”可以用来选择多个文件。这种形式的文件名,有一些字符有着特殊的含义。星号意味着匹配任何东西,问号意味着匹配一个字符。如:“*.txt”表示任何文件名以.txt结尾的文件。
文件名称得模式匹配,使用了有限的匹配符。还有当前网络上的搜索引擎也允许使用某些指定的匹配符来进行内容搜索。正则表达式采用丰富的匹配字符,可以处理各种复杂的问题。
首先我们介绍两个位置匹配符:
^ : 表示一行文字的开始位置
$ : 表示一行文字的结束位置
如:表达式:"^Cat", 匹配的单词Cat出现在行的开始处,注意^是一个位置字符,不是要匹配字符的本身。
同样,表达式:"Cat$" 匹配的单词Cat出现来一行的结尾处。
接下来,我们介绍表达式中的方括号"[]", 它表示匹配括号中字符中的一个。如:
表达式:"[0123456789]"将匹配数字0到9的任何一个。
例如:我们要查找文本中,所有包含gray或者grey,那么表达式可以这么写:"gr[ea]y"
[ea]表示匹配ea中的一个,而不是整个ea。
如果我们要匹配html中的<H1><H2><H3><H4><H5><H6>的标签,我们可以写表达式:
"<H[123456]>",但是如果我们要匹配所有字符中的一个呢?哈,问题就来了,在方括号中写出所有的字符?很幸运,我们不必这么做,我们引进范围符号"-";
使用范围符号,我们只需要给出一个范围的边界字符即可,上面的Html例子,我们可以写成:"<H[1-6]>"
而表达式:"[0-9a-zA-Z]"的意思现在清楚了吧?它匹配数字字符,小写26个字母和大写26个字母中的一个。
出现在[]中的"^"符号
如果你看到表达式如:"[^0-9]",此时,"^"不再是前面说的位置符号,这里它是否定符号,表示排除的意思,上面的表达式,表示不包含数字0到9的字符。
思考1:表达式"q[^u]"的意思。假如有下列的单词,那些将被匹配?
Iraqi
Iraqian
miqra
qasida
qintar
qoph
zaqqum
除了范围字符的表示之外,还有一个是点字符".",点字符出现在表达式中,表示匹配任何字符。
如表达式:"07.04.76"将匹配:
形如:07/04/76, 07-04-76,07.04.76。
如果我们需要在某些字符中可选择,我们可以采用选项字符"
关键词:C#中的正则表达式(1)