C#知识点-17(正则表达式)

正则表达式

概念:正则表达式是用来进行文本处理的技术,是语言无关的,在几乎所有语言中都有实现

元字符:

1、.:匹配除\n之外的任何单个字符。例如正则表达式"b.g"能匹配如下字符串:"big"、"bug"、"b g",但是不匹配"buug","b..g"可以匹配"buug"。

2、[ ] :字符组,匹配括号中的任何一个字符(范围,字符集合)。例如正则表达式"b[aui]g"匹配bug、big和bag,但是不匹配beg、baug。可以在括号中使用连字符"-"来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式"a[0-9]c"等价于"a[0123456789]c"就可以匹配"a0c"、"a1c"、"a2c"等字符串;还可以制定多个区间,例如"[A-Za-z]"可以匹配任何大小写字母,"[A-Za-z0-9]"可以匹配任何的大小写字母或者数字。

3、| :将两个匹配条件进行逻辑"或"运算。'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

4、( ) :将 () 之间括起来的表达式定义为"组"(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级、定义提取组两个作用。

限定符:限定前面正则表达式出现的次数

1、*:匹配0至多个在它之前的子表达式。等价于{0,}。例如正则表达式"zo*"(等同于z(o)*)能匹配 "z" 、"zo"以及 "zoo";因此".*"意味着能够匹配任意字符串。"z(b|c)*"→zb、zbc、zcb、zccc、zbbbccc。"z(ab)*"能匹配z、zab、zabab(用括号改变优先级)。

2、+ :匹配前面的子表达式一次或多次,和*对比(0到多次)。等价于{1,}例如正则表达式9+匹配9、99、999等。 "zo+"能匹配 "zo"以及 "zoo" ,不能匹配"z"。

3、? :匹配前面的子表达式零次或一次。等价于:{0,1}例如,"do(es)?" 可以匹配 "do" 或 "does" 。【colou?r、favou?r】一般用来匹配"可选部分"。(终止贪婪模式)

4、{n} :匹配确定的 n 次。"zo{2}"→zoo。例如,"e{2}" 不能匹配"bed"中的"e",但是能匹配"seed"中的两个"e"。 //seeeed,不可以。

5、{n,} :至少匹配n次。例如,"e{2,}"不能匹配"bed"中的"e",但能匹配 "seeeeeeeed"中的所有"e"。

6、{n,m} :最少匹配 n 次且最多匹配 m 次。"e{1,3}"将匹配"seeeeeeeed"中的前三个"e"。 {2,5}//bed,seed,seeed;beeeeed错误。

7、^(shift+6) :匹配一行的开始。例如正则表达式"^regex"能够匹配字符串"regex我会用"的开始,但是不能匹配"我会用regex"。

8、(shift+4) :匹配行结束符。例如正则表达式"浮云" 能够匹配字符串"一切都是浮云"的末尾,但是不能匹配字符串"浮云呀"

正则简写表达式:

\d:代表一个数字,等同于[0-9] \\d →\d

\D:代表非数字,等同于[^0-9]

\s:代表换行符、Tab制表符等空白字符 ,(空格、回车、制表符)

\S:代表非空白字符(a0%$@@)

\w:匹配字母或数字或下划线或汉字,即能组成单词的字符。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \w 等效于 [a-zA-Z_0-9]。 ^()!@#%^&*()

\W:非\w ,等同于[^\w] %

\b:单词的边界(一边是单词(\w),一边不是单词。(\W))。Hello ni hao,are you kidding? D-Day

正则表达式(Regular Expression)的主要类:Regex

常用的3种情况:(C#语法)

判断是否匹配:Regex.IsMatch("字符串","正则表达式");

字符串提取:Regex.Match("字符串","要提取的字符串的正则表达式");//只能提取一个(提取一次)

字符串提取(循环提取所有): Regex.Matches(),(可以提取所有匹配的字符串。)

字符串替换:Regex.Replace("字符串","正则","替换内容");

Regex.Split();

贪婪模式&&非贪婪模式

贪婪模式演示:(当提取多个超链接的时候)

"1111。11。111。111111。"

贪婪:.+。(默认为贪婪模式,尽可能的多匹配。)

非贪婪:.+?。(尽可能的少匹配,(1个。))

从文本提取出名字:

Match match = Regex.Match("大家好。我是S.H.E。我22岁了。我病了,呜呜。fffff", "我是(.+)。");//没有加^$。

看结果。+、*的匹配默认是贪婪(greedy)的:尽可能多的匹配,直到"再贪婪一点儿"其后的匹配模式就没法匹配为止。

在+、*后添加?就变成非贪婪模式(? 的另外一个用途):让其后的匹配模式尽早的匹配。修改成"我是(.+?)。"

一般开发的时候不用刻意去修饰为非贪婪模式,只有遇到bug的时候发现是贪婪模式的问题再去解决。如果匹配的结果比自己预想的要多,那么一般都是贪婪模式的原因。

匹配组

正则表达式可以从一段文本中将所有符合匹配的内容都输出出来。Match获得的是匹配的第一个。Regex.Matches方法可以获得所有的匹配项。

字符串替换

Regex.Replace,将字符串中匹配的内容替换为指定的内容

将所有连续的a替换为一个A(原需求:把连续的空格替换为一个空格):

string s = Regex.Replace("你aaa好aa哈哈a你", "a+", "A");

删除所有连续的a,其实就是将连续的a替换为空字符串。

相关推荐
liuyang___1 小时前
第一次经历项目上线
前端·typescript
西哥写代码1 小时前
基于cornerstone3D的dicom影像浏览器 第十八章 自定义序列自动播放条
前端·javascript·vue
清风细雨_林木木1 小时前
Vue 中生成源码映射文件,配置 map
前端·javascript·vue.js
FungLeo2 小时前
node 后端和浏览器前端,有关 RSA 非对称加密的完整实践, 前后端匹配的代码演示
前端·非对称加密·rsa 加密·node 后端
不灭锦鲤2 小时前
xss-labs靶场第11-14关基础详解
前端·xss
不是吧这都有重名2 小时前
利用systemd启动部署在服务器上的web应用
运维·服务器·前端
霸王蟹2 小时前
React中巧妙使用异步组件Suspense优化页面性能。
前端·笔记·学习·react.js·前端框架
Maỿbe3 小时前
利用html制作简历网页和求职信息网页
前端·html
森叶3 小时前
Electron 主进程中使用Worker来创建不同间隔的定时器实现过程
前端·javascript·electron
霸王蟹3 小时前
React 19 中的useRef得到了进一步加强。
前端·javascript·笔记·学习·react.js·ts