




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
正则表达式相信大家都有在电脑上查找某个文件的经历,例如需要把C盘中的所有Word文档给找出来,很简单,只需要按“Ctrl+F”快捷键,调出系统的搜索窗口,然后在文件名窗口输入“*.doc”,单击“搜索”按钮后Windows就会找到所有的Word文档。如果改变搜索目标,改为“w*.doc”,那么Windows就会找出所有以字母w开头的Word文档。为什么Windows知道我们要找的是Word文档?为什么它会把所有的Word文档都找出来?秘密就是“*.doc”。这里的*是通配符,表示文件名不限,可以匹配任何的文件名而.doc是扩展名。可见,就是这样一个描述了查询目标特征的字符串,让系统了解了我们的查询目标。正则表达式也类似一个字符串,它描述了目标字符串的特征。正则表达式引擎正是使用这种特征,实现了在一在堆的字符串中查找或者替换我们符合要求的字符串。先来看一个简单的正则表达式:“hi”,使用这个正则表达式可以在“aabbhibbaahiaa”中将两个“hi”字符串给找出来,.NET还提供了一些非常复杂的类来识别字符串,或从长字符串中提取满足某些复杂条件的子字符串。例如,找出字符串中重复出现的某个字符或一组字符,或者找出以s开头、且至少包含一个n的所有单词,或者找出遵循雇员ID或社会安全号码约定的字符串。虽然可以使用String类,编写方法来执行这类处理,但这类方法编写起来比较繁琐,而使用System.Text.RegularExpressions命名空间中的类就比较简单,System.Text. RegularExpressions专门用于执行这类处理。正则表达式在很多领域都得到了广泛的应用,例如:l 在B/S应用程序前端表达验证中,我们使用正则表达式来验证诸如电子邮件、网址、日期等的格式是否正确,以及用户名、密码的合法性等。l 在网络爬虫应用程序中,可以使用正则表达式来分析网页的源代码HTML,找出其中的URL等有用信息。l 在文本/代码编辑器应用程序中,可以使用正则表达式来查找某个特定的字符,甚至可以将之替换为别的特定字符串。正则表达式的语法很多语言都提供了对于正则表达工的支持,C#自然也不例外。使用正则表达式处理文本或字符串至少要有两个输入项,然后正则表达式引擎才可以根据这两个输入来输入来输出结果。这两个输入如下。l 使用正则表达式语法编写的模式字符串。正则表达式有其独待的语法定义,虽然很多语言都支持正则表达式,但其语法不尽相同,C#中支持的正则表达式语法和Perl5中的语法相兼容,而且还添加了一些其他特性,诸如从右到左匹配。l 需要分析的文本或者字符串。第二项不需多说,关键在于第一个输入项。要编写一个模式字符串,就需要十分地熟悉正则表达式语法,这也是本节的目标。由于正则表达式的内容实在太多,因此这里挑选了一些比较重要的,或者比较常用的部分语法进行介绍。正则表达式的语法内容主要分成如下几个部分:字符转义、定位点、字符类、限定类、分构造以及替换构造。1 字符转义这里的转意字符主要是指当一个反斜杠()和某些字符放在一起时代表一些特殊含义,主要包括以下两种情况l 其后的字符是一个特殊字符。例如:b指示正则表达式匹配应在单词边界上开始的定位点,t表示一个制表符,而x020表示空格。l 按某些字符的愿意解释,避免解释成其他含义。例如:大括号“”是开始限定符的定义,但反斜杠后接大括号“”表示正则表达式引擎应匹配大括号。同样,一个反斜械标志转义语言构造的开头,但两个反斜杠()则指示正则表达式引擎应匹配反斜杠()。正则表达式字符转义列表转义字符说明将下一个字符标记为一个特殊字符、一个原义字符、一个向后引用或一个八进制转义字符。f匹配一个换页符n匹配一个换行符r匹配一个回车符t匹配一个制表符v匹配一个垂直制表符cx匹配由x指明的控制字符。例如,cM匹配一个Control-M或回车符。c的值必须为A-Z或a-z之一。否则,将c将视为一个原义的“c”字符。xnn匹配n,其中n为十六进制转义值。十六进制转义值必须确定的两个数字长。例如,x41匹配“A”。x041则等价于x04&“1”。正则表达式可以用ASCII编码。unnnn匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,u00A9匹配版权符号(?)2 定位点定位点主要作用是指示字符串中必须发生匹配的位置,如果正则表达式中使用了定位点,那么引擎就不会在字符串的其他位置搜索,而是只在定位点指示的位置搜索,例如:$指示必须从字符串的末尾或者行尾开始搜索,而则指示从开头开始搜索,具体的定点列表如表所示。元素说明示例匹配的示例匹配必须从字符串或一行的开头开始。d匹配“206”的2$匹配必须出现在字符串的末尾或出现在字符串末尾的n之前d$匹配“206”的6A匹配必须出现在字符串的开头Ad匹配“206”的2Z匹配必须出现在字符串的末尾或出现在字符串末尾的n之前dZ匹配“206”的6z匹配必须出现在字符串的末尾dz匹配“206”的6G匹配必须出现在上一个匹配结束的地方Gd匹配“2a06”中的2b匹配一个单词边界,也就是指单词和空格间的位置db可以匹配“dogs102”中的2,但不能匹配其中的1和0B匹配不能出现在b边界上dB可以匹配“dogs102”中的1和0,但不能匹配23 字符类字符类与一组字符中的任何一个字符匹配。字符类说明.小数点可以匹配除了换行符“”之外的任何单个字符。如可以匹配“favorite”中的全部字符.x|y匹配 x 或 y。例如,z|food 能匹配 z 或 food。(z|f)ood 则匹配 zood 或 food。xyz字符集合。匹配所包含的任意一个字符。例如, abc 可以匹配 plain 中的 a。xyz 负值字符集合。匹配未包含的任意字符。例如, abc 可以匹配 plain 中的p、l、i、n。a-z字符范围。匹配指定范围内的任意字符。例如,a-z 可以匹配 a 到 z 范围内的任意小写字母字符。a-z负值字符范围。匹配任何不在指定范围内的任意字符。例如,a-z 可以匹配任何不在 a 到 z 范围内的任意字符。d匹配一个数字字符。等价于 0-9。D匹配一个非数字字符。等价于 0-9。s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 fnrtv。匹配“ Im ok!”中的空格,字符索引3开始,到索引4截止。S匹配任何非空白字符。等价于 fnrtv。w匹配包括下划线的任何单词字符。等价于A-Za-z0-9_。W 匹配任何非单词字符。等价于 A-Za-z0-9_。4 限定符限定符指定在输入中必须在存在字符、组或字符类的多少个实例才能找到匹配项。正则表达式限定符列表限定符说明*匹配前面的子表达式零次或多次。例如,zo* 能匹配 z 以及 zoo。* 等价于0,。+匹配前面的子表达式一次或多次。例如,zo+ 能匹配 zo 以及 zoo,但不能匹配 z。+ 等价于 1,?匹配前面的子表达式零次或一次。例如,do(es)? 可以匹配 do 或 does 中的do 。? 等价于 0,1nn 是一个非负整数。匹配确定的 n 次。例如,o2 不能匹配 Bob 中的 o,但是能匹配 food 中的两个 o。n,n 是一个非负整数。至少匹配n 次。例如,o2, 不能匹配 Bob 中的 o,但能匹配 foooood 中的所有 o。o1, 等价于 o+。o0, 则等价于 o*。n,mm 和 n 均为非负整数,其中n = m。最少匹配 n 次且最多匹配 m 次。例如,o1,3 将匹配 fooooood 中的前三个 o。o0,1 等价于 o?。请注意在逗号和两个数之间不能有空格。?当该字符紧跟在任何一个其他限制符 (*, +, ?, n, n, n,m) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 oooo,o+? 将匹配单个 o,而 o+ 将匹配所有 o。*?指定尽可能少地使用重复的第一个匹配(等效于 lazy *)。+?指定尽可能少地使用重复但至少使用一次(等效于 lazy +)。?指定使用零次重复(如有可能)或一次重复 (lazy ?)。 n ?等效于 n (lazy n)。 n ,?指定尽可能少地使用重复但至少使用 n 次 (lazy n,)。 n , m ?指定介于 n 次和 m 次之间、尽可能少地使用重复 (lazy n,m)。5 分组构造分组构造用于匹配输入字符串中重复的子表达式。分组构造说明(子表达式)捕获匹配的子字符串(或非捕获组;有关更多信息,请参见正则表达式选项中的 ExplicitCapture 选项)。使用 () 的捕获根据左括号的顺序从 1 开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。(?:子表达式)非捕获组。(?子表达式)将匹配的子字符串捕获到一个组名称或编号名称中。用于 name 的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如 (?name)。(?子表达式)平衡组定义。删除先前定义的 name2 组的定义并在 name1 组中存储先前定义的 name2 组和当前组之间的间隔。如果未定义 name2 组,则匹配将回溯。由于删除 name2 的最后一个定义会显示 name2 的先前定义,因此该构造允许将 name2 组的捕获堆栈用作计数器以跟踪嵌套构造(如括号)。在此构造中,name1 是可选的。可以使用单引号替代尖括号,例如 (?name1-name2)。(?=子表达式)零宽度正预测先行断言。仅当子表达式在此位置的右侧匹配时才继续匹配。例如,w+(?=d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。(?!子表达式)零宽度负预测先行断言。仅当子表达式不在此位置的右侧匹配时才继续匹配。例如,b(?!un)w+b 与不以 un 开头的单词匹配。(?=子表达式)零宽度正回顾后发断言。仅当子表达式在此位置的左侧匹配时才继续匹配。例如,(?=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。(?子表达式)非回溯子表达式(也称为“贪婪”子表达式)。该子表达式仅完全匹配一次,然后就不会逐段参与回溯了。(也就是说,该子表达式仅与可由该子表达式单独匹配的字符串匹配。)(? imnsx-imnsx : 子表达式)应用或禁用子表达式中指定的选项。例如,(?i-s: ) 将打开不区分大小写并禁用单行模式。有关更多信息,请参见正则表达式选项。num后向引用。匹配编号子表达式的值。k命名后向引用。匹配命名表达式的值。6 替换构造替换构造用于修改正则表达式,以支持either/or或条件匹配替换结构说明|与以 |(竖线)字符分隔的术语中的任何一项匹配;例如, cat|dog|tiger。使用最左侧的成功匹配。(?(表达式)yes|no)如果表达式在此位置匹配,则与“yes”部分匹配;否则,与“no”部分匹配。“no”部分可省略。表达式可以是任何有效的子表达式,但它将变为零宽度断言,因此该语法等效于 (?(?=expression)yes|no)。请注意,如果表达式是命名组的名称或捕获组编号,则替换构造将解释为捕获测试(在本表的下一行对此进行了描述)。若要避免在这些情况下产生混淆,则可以显式拼出内部 (?=expression)。(?(name)yes|no)如果命名捕获字符串有匹配,则与“yes”部分匹配;否则,与“no”部分匹配。“no”部分可省略。如果给定的名称不与此表达式中使用的捕获组的名称或编号对应,则替换构造将解释为表达式测试(在本表的上一行进行了描述)。.NET对于正则表达式的支持System.Text.RegularExpressions命名空间提供了对正则表达式的支持,主要的类包括Capture、CaptureCollection、Group、GroupCollection、Match、MatchCollection有及Regex,其中除了Regex以外,其他类均为只读,也均为不可变类,且均无公共构造函数。事实上它们的构造函数都是内部访问级别,也就是说只有同程序集的类型才可以将它们实例化。其中CaptureCollection、GroupCollection以及MatchCollection均为集合类,都实现了ICollection和IEnumerable接口,因此可以像使用集合一样使用它们。其中包括使用foreach循环顺序访问集合中的第一个元素,只不过它们都是只读集合,这一点需要注意。图为类图,从中可以看出它们之间的关系。.Net正则表达式核心类图下表列出各类的几点说明,以帮助理解类各类的功能。类说明Capture表示单个子表达式捕获中的结果,从类图中可以看到,它是Group和Match的基类,很明显Group和Match也是捕获结果的另一种表达形式。另外,因为Capture无公共构造函数,它的实例对象只能由CaptureCollection对象返回。Capture主要定义了一些公共属性,注意属性都是只读的如下:Index:表示找到的目标字符串在原字符串中的索引位置。Length:表示找到的目标字符串的长度。Value:表示找到的目标字符串。该值也可以通过Capture类已重载的ToString()方法返回。CaptureCollection表示一个捕获子字符串序列。CaptureCollection 返回由单个捕获组执行的捕获的集合。CaptureCollection集合内部有一个Capture对象数组,每一个Capture对象都代表一个捕获结果。可以通过Group.Captures属性或Match.Captures属性获得CaptureCollection类的实例。GroupGroup 表示单个捕获组的结果。由于存在数量词,一个捕获组可以在单个匹配中捕获零个、一个或更多的字符串,因此 Group 提供Capture 对象的集合。GroupCollection表示捕获组的集合。GroupCollection 返回单个匹配中的捕获组的集合。Match表示单个正则表达式匹配的结果。Regex.Match方法返回一个Match对象,作为第一个匹配项,其他的匹配项可通过Match.NextMatch获得。可以通过Match对象的Success属性来判断匹配是否成功。还可以通过Match对象获得所有匹配的组的集合(GroupCollection)以及所有捕获的集合(Captures,属于父类Group的成员)MatchCollection表示通过以迭代方式将正则表达式模式应用于输入字符串所找到的成功匹配的集合。Regex表示不可变的正则表达式。接下来重点介绍Regex对象。使用Regex有两种方法,其一就是将其实例化,然后调用实例方法;其二是调用静态方法,而不进行实例化。这两种方法是等价的,读者可以自主选择。如果选择实例化Regex对象,那么就有必要了解Regex对象的构造函数以及相应的实例方法,接下来分别进行介绍。Regex有两个公共构造函数,如下表所示:构造函数说明Regex (String) 为指定的正则表达式初始化并编译 Regex 类的一个新实例。 Regex (String, RegexOptions) 用修改模式的选项为指定的正则表达式初始化并编译 Regex 类的一个新实例。 RegexOptions枚举的一些选项:成员名称说明Compiled指定将正则表达式编译为程序集。这会产生更快的执行速度,但会增加启动时间。CultureInvariant指定忽略字符串的文化背景。ECMAScript为表达式启用符合 ECMAScript 的行为。该值只能与 IgnoreCase、Multiline 和 Compiled 值一起使用。该值与其他任何值一起使用均将导致异常。ExplicitCapture指定有效的捕获仅为形式为 (?.) 的显式命名或编号的组。这使未命名的圆括号可以充当非捕获组,并且不会使表达式的语法 (?:.) 显得笨拙。IgnoreCase指定不区分大小写的匹配。IgnorePatternWhitespace消除模式中的非转义空白并启用由 # 标记的注释。但是,IgnorePatternWhitespace 值不会影响或消除字符类中的空白。 Multiline多行模式。更改 和 $ 的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。None指定不设置选项。RightToLeft指定搜索从右向左而不是从左向右进行。Singleline指定单行模式。更改点 (.) 的含义,使它与每一个字符匹配(而不是与除 n 之外的每个字符匹配)。正则表达式简单应用1、查找是否有符合条件的字符串bool hasStr=Regex.Match(南阳理工学院(002444), d6).Success;bool hasStr=Regex.IsMatch(南阳理工学院(002444), d6);2、查找符合条件的一个字符串的值(002444)string FindStr=Regex.Match(南阳理工学院(002444)C#程度设计(000550), d6).Valuestring findStr = Regex.Match(南阳理工学院(002444), 0-96).Value;string findStr = Regex.Match(南阳理工学院(002444), (.+).Value.TrimStart().TrimEnd();string findStr = Regex.Match(南阳理工学院(002444)C#程度设计(000550), 0-96).NextMatch().Value;3、查找所有符合条件的字符串的值foreach (Match i in Regex.Matches(南阳理工学院(002444)C#程度设计(000550), (d6) Console.WriteLine(i.Value);string str = 南阳理工学院(002444)C#程度设计(000550);Regex regex = new Regex(d6),RegexOptions.Singleline);MatchCollection matchCollection = regex.Matches(str);foreach (Match i in matchCollection) Console.WriteLine(i.Value);4、替换查找到的字符串string strReplace=Regex.Replace(南阳理工学院(002444)C#程度设计(000550), (d6), )【例】Regex类应用using System.Text
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (2025年标准)股权合并协议书
- 金融智能投顾-洞察及研究
- 水母毒素生物标志物-洞察及研究
- 耐久性劣化机理研究-洞察及研究
- 跑酷智能辅助系统-洞察及研究
- 晶体缺陷工程应用-洞察及研究
- 2025年新建材合伙经营协议书
- (2025年标准)家庭房源转让协议书
- 跨境养殖品牌推广-洞察及研究
- (2025年标准)游戏号转让协议书
- 2025年基孔肯雅热和登革热防控知识考试试题及参考答案
- 2025-2026学年第一学期安全主题教育
- 汽车美容承包合同(标准版)
- 管道设计培训课件
- 2025-2026学年新交际英语(2024)小学英语一年级上册教学计划及进度表
- 会务服务考试试题及答案
- 《心系国防 强国有我》 课件-2024-2025学年高一上学期开学第一课国防教育主题班会
- 《创伤失血性休克中国急诊专家共识(2023)》解读课件
- 私募基金份额代持协议范文
- 资料管理方案5篇
- 《退役军人保障法》知识考试题库(含各题型)
评论
0/150
提交评论