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

相关推荐
天宇&嘘月2 小时前
web第三次作业
前端·javascript·css
小王不会写code2 小时前
axios
前端·javascript·axios
发呆的薇薇°3 小时前
vue3 配置@根路径
前端·vue.js
luckyext3 小时前
HBuilderX中,VUE生成随机数字,vue调用随机数函数
前端·javascript·vue.js·微信小程序·小程序
小小码农(找工作版)3 小时前
JavaScript 前端面试 4(作用域链、this)
前端·javascript·面试
前端没钱4 小时前
前端需要学习 Docker 吗?
前端·学习·docker
前端郭德纲4 小时前
前端自动化部署的极简方案
运维·前端·自动化
海绵宝宝_4 小时前
【HarmonyOS NEXT】获取正式应用签名证书的签名信息
android·前端·华为·harmonyos·鸿蒙·鸿蒙应用开发
码农土豆5 小时前
chrome V3插件开发,调用 chrome.action.setIcon,提示路径找不到
前端·chrome
鱼樱前端5 小时前
深入JavaScript引擎与模块加载机制:从V8原理到模块化实战
前端·javascript