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替换为空字符串。

相关推荐
点燃银河尽头的篝火(●'◡'●)17 分钟前
【BurpSuite】Cross-site scripting (XSS 学徒部分:1-9)
前端·web安全·网络安全·xss
Jiaberrr43 分钟前
手把手教你:微信小程序实现语音留言功能
前端·微信小程序·小程序·语音·录音
熊猫在哪43 分钟前
安装nuxt3
前端·nuxt.js
安冬的码畜日常1 小时前
【CSS in Depth 2 精译_036】5.6 Grid 网格布局中与对齐相关的属性 + 5.7本章小结
前端·css·css3·html5·网格布局·grid·css网格
啧不应该啊2 小时前
vue配置axios
前端·javascript·vue.js
__fuys__2 小时前
【HTML样式】加载动画专题 每周更新
前端·javascript·html
Want5953 小时前
HTML粉色烟花秀
前端·css·html
让开,我要吃人了3 小时前
HarmonyOS鸿蒙开发实战(5.0)自定义全局弹窗实践
前端·华为·移动开发·harmonyos·鸿蒙·鸿蒙系统·鸿蒙开发
yanlele3 小时前
前端面试第 66 期 - Vue 专题第二篇 - 2024.09.22 更新前端面试问题总结(20道题)
前端·javascript·面试
一条晒干的咸魚3 小时前
响应式CSS 媒体查询——WEB开发系列39
前端·css·html·css3·响应式设计·媒体查询