C#_正则表达式
概述
正则表达式,主要是用符号描述了一类特定的文本(模式)。而正则表达式引擎则负责在给定的字符串中,查找到这一特定的文本。
本文主要是列出常用的正则表达式符号,加以归类说明。本文仅仅是快速理解了正则表达式相关元字符,作一个备忘,供以后理解更复杂表达式的参考,以后关于正则表达式的相关内容会持续更新本文。示例语言用C#
普通字符
最简单的一种文本描述,就是直接给出要匹配内容。 如要在”Generic specialization, the decorator pattern, chains of responsibilities, and extensible software.” 找到pattern,那么正则式就直接是”heels”即可
字符集合
将字符放在中括号中,即为字符集合。通过字符集合告诉正则式引擎从字符集合中的字符,仅匹配出一个字符。
| 字符 | 匹配的字符 | 示例 |
| [...] | 匹配括号中的任一字符 | [abc]可以匹配单个字符a,b或c,但不能匹配其它字符 |
| [^...] | 匹配非括号中的任一字符 | [^abc]可以匹配任一个除a,b,c的一个字符,如d,e,f |
比如单词灰色gray(英)和grey(美),在一段文本中匹配出gray或grey,那么通过正则式gr[ae]y 就可以了;又比如要在一段文本中找到me和my,正则式是m[ey]
我们还可以在字符集合中使用连字号 – 来表示一个范围,比如 [0-9] 表示匹配一个0到9数字;[a-zA-Z] 表示匹配英文字母;[0-9 a-zA-Z]表示匹配一个0到9的数字或英文字母
速记的字符集合
我们常常要匹配一个数字,一个字母,一个空白符,虽然可以用普通的字符类来表示,但不够方便,所以正则式提示了一些常用的字符集合的速记符
| 字符 | 匹配的字符 | 示例 |
| \d | 从0到9的任何一个数字 | \d\d 可以匹配72,但不能匹配me或7a |
| \D | 非数字符 | \D\D 可以匹配me,但不能匹配7a或72 |
| \w | 任一个单词字符,如A-Z, a-z, 0-9和下划线字符 | \w\w\w\w可以匹配aB_2,但不能匹配ab_@ |
| \W | 非单词字符 | \W 可以匹配@,但不能匹配a |
| \s | 任一空白字符,包括了制表符,换行符,回车符,换页符和垂直制表符 | 匹配所有传统的空白字符 |
| \S | 任一非空白字符 | \S 可以匹配任一非空白字符,如~!@#& |
| . | 任一字符 | 匹配任一字符,换行符除外 |
指定重复次数的字符
指定重复匹配前面的字符多少次:匹配重复的次数,不匹配内容。比如说,要在一系列电话号码中找到以158开始的11位手机号,如果我们没有学过下面的内容,正则表达式为158\d\d\d\d\d\d\d\d;但如果我们学习了下面的知识,则正则表达式为158\d{8}
| 字符 | 匹配的字符 | 示例 |
| {n} | 匹配前面字符n次 | x{2},可以匹配xx,但不能匹配xxx |
| {n,} | 匹配前面字符n次或更多 | x{2,}可以2个或更多的x,比如可以匹配xx,xxx,xxxx,xxxxxx |
| {n,m} | 匹配前面字符最少n次,最多m次。如果n为0,则可以不指定 | x{2,4},匹配了xx,xxx,xxxx,但不能匹配x,xxxxx |
| ? | 匹配前面的字符0次或1次,相当于{0,1} | x? 匹配x或空 |
| + | 匹配前面的字符1次或多次, 相当于{1,} | x+ 匹配x,xx,或xxx |
| * | 匹配前面的字符0次或多次 | x* 匹配0个或多个x |
匹配位置的字符
现在我们已经学会了使用字符集合,字符集合的速记符来匹配大部分的文本了。但是如果我们遇到以下的情况,怎么办?
要求匹配文本的第一个单词为google
要求匹配文本以bye结束
要求匹配文本每一行的第一个单词为数字
要求匹配一个单词以hel开头
上面的这种匹配一个位置,但不匹配任何内容的需求很正常。在正则表达式中也提供了一些特殊的字符来匹配位置(不匹配内容)。如用^匹配文本的开始位置, 用$匹配文本的结束位置,\b匹配一个单词的边界
| 字符 | 匹配的字符 | 示例 |
| ^ | 其后的模式必须在字符串的开始处,如果是一个多行字符串,应位于任一行的开始。对于多行文本(有回车符),需要设置Multiline标识 | |
| $ | 前面的模式必须在字符串的结尾处,如果是一个多行字符串,应该在任一行的末尾 | |
| \b | 匹配一个单词的边界, | |
| \B | 匹配一个非单词的边界,并不在一个单词的开始或结尾处 | |
| \A | 前面的模式必须在字符串的开始,并忽略多行标识 | |
| \z | 前面的模式必须在字符串的末尾,并忽略多行标识 | |
| \Z | 前面的模式必须在字符串的末尾,或是位于换行符前 |
分支替换字符
在字符集合中,我们可以在用中括号来指定匹配中括号中的任一字符,即模式中可以列出多种字符情景,被匹配的文本只要有符合其中的任一情景就可以被匹配出来。 那有没有这样的一种机制,同一个正则式中有多个模式,只有满足其中的任一模式就可以被匹配出来。再配合分组,就可以把一个复杂的正则式分成多个相对简单子的正则式来做。类似于逻辑符号OR的意思吧。
| 字符 | 匹配的字符 | 示例 |
| | | 选择匹配符,匹配前面或后面的任一模式 | cat|mouse 可以匹配出cat 或mouse |
匹配特殊字符
到现在,我们已经知道了字符集合,一些速记的字符集合,匹配位置的字符,指定匹配次数的字符,分支匹配。我们用的这些符号,在正则表达式中代表了各种特定的意义。那当我们要匹配这些字符本身,我们应该怎么办?在特殊字符前加上\, 以下是一些常用特殊字符的转义字符的列表
| 字符 | 匹配的字符 | 示例 |
| \\ | 匹配字符\ | |
| \. | 匹配字符. | |
| \* | 匹配字符* | |
| \+ | 匹配字符+ | |
| \? | 匹配字符? | |
| \| | 匹配字符| | |
| \( | 匹配字符( | |
| \) | 匹配字符) | |
| \{ | 匹配字符{ | |
| \} | 匹配字符} | |
| \^ | 匹配字符^ | |
| \$ | 匹配字符$ | |
| \n | 匹配字符n | |
| \r | 匹配字符r | |
| \t | 匹配字符t | |
| \f | 匹配字符f | |
| \nnn | 匹配一个三位八进制数指定的ASCII字符,如\103匹配一个大写的C | |
| \xnn | 匹配一个二位十六进制数指定的ASCII字符,如\x43匹配C | |
| \xnnnn | 匹配一个四位十六进制数指定的unicode字符 | |
| \cV | 匹配一个控制字符,如,\cV匹配Ctrl+V |
组,反向引用,非捕获组
组,可以用圆括号,将正则表达式的部分括起来并独立使用,在圆括号之间的正则式叫做一个组。可以将匹配次数的字符和分支匹配字符应用到组。
1 示例: public void Set, public void SetValue
正则式Set(Value)? , 其中(Value)是一个组,匹配次数的字符?将应用于整个组(Value),可以匹配到Set或SetValue
2 示例:Out of sight, out of mind
正则式: “(out of) sight, \1 mind”
正则表达式引擎会将 “()”中匹配到的内容存储起来,作为一个“组”,并且可以通过索引的方式进行引用。表达式中的“\1”,用于反向引用表达式中出现的第一个组。 同时在c#中,也可以通过组来访问捕获到的组的内容。注意,Groups[0]是整个匹配的字符串,组的内容从索引1开始
3 可根据组名进行索引。使用以下格式为标识一个组的名称(?<groupname>…)
正则式: “(?<Group1>out of) sight, \1 mind”
4在表达式外引用,对于索外用$索引,或组名用${组名}
示例:Out of of sight, out of mind
正则式 “(?<Group1>[a-z]+) \1”
5非捕获组,在组前加上?: 因为有的组表达的仅仅是一个选择替换,当我们不想用浪费存储时,以用不捕获该组
"(?:out of) sight"
| 字符 | 匹配的字符 | 示例 |
| (?<groupname>exp) | 匹配exp,并捕获文本到名称为name的组里 | |
| (?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
贪婪与非贪婪
正则表达式的引擎默认是贪婪,只要模式允许,它将匹配尽可能多的字符。通过在“重复描述字符(*,+等)”后面添加“?”,可以将匹配模式改成非贪婪。贪婪与非贪婪与指定重复次数的字符的内容密切相关。
| 字符 | 匹配的字符 | 示例 |
| ? | 如果是跟在量词(即指定匹配次数的字符)后面,那么正则表达式则采用非贪婪模式 |
示例 out of sight, out of mind
贪婪正则式 : .* of 输出out of sight, out of
非贪婪正则式 : .*? of 输出 out of
另外一个示例
输入:The title of cnblog is <h1>code changes the world</h1>
目标:匹配HTML标记
正则式1:<.+>
正则式1的输出: <h1>code changes the world</h1>
正则式2:<.+?>
正则式2的输出: <h1> </h1>
回溯与非回溯
使用“(?>…)”方式进行非回溯声明。由于正则表达式引擎的贪婪特性,导致它在某些情况下,将进行回溯以获得匹配,请看下面的示例:
示例:Live for nothing, die for something
正则式(默认非回溯): “.*thing,” 输出Live for nothing 。“.*”由于其贪婪特性,将一直匹配到字符串的最后,随后匹配“thing”,但在匹配“,”时失败,此时引擎将回溯,并在“thing,”处匹配成功
正则式(回溯):”(?>.*)thing,” 匹配不到任何东西。由于强制非回溯,所以整个表达式匹配失败
| 字符 | 匹配的字符 | 示例 |
| (?>...) | 匹配组内表达式时,不回溯 |
正向预搜索、反向预搜索
匹配特定的模式,并声明前面或后面的内容。意思跟匹配位置差不多
| 字符 | 匹配的字符 | 示例 |
| (?=exp) | 左边的模式后面必须紧跟着exp,声明本身不作为匹配结果的一部分 | |
| (?!exp) | 左边的模式的后面不能紧跟着exp,声明本身不作为匹配结果的一部分 | |
| (?<=exp) | 右边的模式的前面必须是exp,声明本身不作为匹配结果的一部分 | |
| (?<!exp) | 右边的模式的前面不能是exp,声明本身不作为匹配结果的一部分 |
C#_正则表达式的更多相关文章
- Java 正则表达式详解_正则表达式
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- Python-老男孩-01_基础_文件IO_函数_yield_三元_常用内置函数_反射_random_md5_序列化_正则表达式_time
Python2.7 缩进统一: 约定 常量 大写 , 变量 小写 判断一个变量在内存中的地址,也能看出是不是一个值 id()函数 >>> x = 'abc' >>&g ...
- Python笔记_第四篇_高阶编程_正则表达式_2.正则表达式入门
1. 匹配单个字符和数字: . --->> 匹配除换行符以外的任意字符.[0123456789] --->> []字符集合,表示匹配方括号中所包含的任意一个字符.[Thomas ...
- 第10章 Shell编程(1)_正则表达式
1. 基础的正则表达式 1.1 正则表达式与通配符 (1)正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式. (2)通配符用来匹配符合条件的 ...
- Shell命令_正则表达式
正则表达式是包含匹配,通配符是完全匹配 基础正则表达式 test.txt示例文件 1 2 3 4 5 6 7 8 9 10 11 12 Mr. James said: he was the hones ...
- Python_Day6_反射_正则表达式之篇
一.反射 定义:利用字符串形式去对象(模块)中操作(寻找/检查/删除/设置)成员 #getattr:获取模块中属性 #hasattr:检查模块中是否存在某个成员(函数) #delattr:删除模块中成 ...
- python成长之路第三篇(2)_正则表达式
打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.什么是正则表达式,python中得正则简介 2.re模块的内容 3.小练习 一.什么是正则表达式(re) 正则表 ...
- Python爬虫(十)_正则表达式
本篇将介绍python正则表达式,更多内容请参考:[python正则表达式] 什么是正则表达式 正则表达式,又称规则表达式,通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式是对字符串操 ...
- 【原】Java学习笔记023 - 字符串缓冲区_正则表达式
package cn.temptation; import java.util.Arrays; public class Sample01 { public static void main(Stri ...
随机推荐
- NFS 系统的搭建
问题: 由于工作,需要,不断得进行挂在硬盘重装系统,NFS 系统给了我一个很好的解决方案.于是决定写一篇博客,防止以后再次使用的时候,能够很快得重新建立NFS 文件系统. 调研: NFS(Networ ...
- matlab使用总结2
1.MATLAB中a./b与a/b的区别以及左除和右除 http://blog.csdn.net/wk119911/article/details/7452411 a=[1 2;3 4]; b=[1 ...
- [LOJ 6029]「雅礼集训 2017 Day1」市场
[LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...
- 【洛谷】【单调队列】P2032 扫描
[题目描述:] 有一个 1 ∗ n 的矩阵,有 n 个正整数. 现在给你一个可以盖住连续的 k 的数的木板. 一开始木板盖住了矩阵的第 1 ∼ k 个数,每次将木板向右移动一个单位,直到右端与第 n ...
- 前后端交互之封装Ajax+SpringMVC源码分析
为什么需要封装呢?因为用的多,我想将其封装成函数,当我想用它时,只需将那个函数对应的js文件引入即可,而不要重复写很多相同代码,利于开发效率的提高. 无论是$.ajax或$.post.$.get等,在 ...
- 基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!
1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (G ...
- OpenCV——图像的深度与通道数讲解
矩阵数据类型: – CV_(S|U|F)C S = 符号整型 U = 无符号整型 F = 浮点型 E.g.: CV_8UC1 是指一个8位无符号整型单通道矩阵, CV_32FC2是指一个32位浮点型双 ...
- drupal 7 连接多个数据库
Drupal7系统,重写了数据库操作内核,其强大的功能无需多言.一次偶然的机会,需要提取Drupal默认安装数据库之外的一个数据库中的数据 ,可谓是绞尽脑汁,上网查阅最后终于找到了一个笨而又合适的方法 ...
- 自研后端HTTP请求参数验证器服务ParamertValidateService
好处:方便了后端对HTTP请求中参数进行核验,只需一次编写效验器,一行代码便可对所有参数的pojo进行参数核验!而且更改效验逻辑时只需要更改效验器类即可,实现了解耦合. 只需要程序员按照规范开发一个P ...
- PI monitor error process-RESOURCE_NOT_FOUND-转
事务:sxi_monitor 状态:system error 类型:Request Message Mapping 错误简要:RESOURCE_NOT_FOUND 错误详细信息: <?xml v ...