C#字符串正则表达式基础语法

原文 C#字符串正则表达式基础语法

C#正则表达式基础语法

正则表达式是个非常好的工具,它的作用主要是用简单的有规则的表达式来检索和匹配一段字符串。
所以正则表达式的作用大致有两种:

1、匹配
2、检索

为了更好的测试正则表达式的规律我们可以采用正则表达式工具。RegEx Buddy。
一、正则表达式基础知识
1、元字符的概念和元字符的反义
(1) 点(.)
表示匹配除了换行符意外的任意单个字符。
C#字符串正则表达式基础语法
(2)\w
表示匹配数字,字母,下划线,汉字等单个字符
C#字符串正则表达式基础语法
如上,空格和标点符号和斜杠都没有匹配上。其余都匹配上了

(3)\s
匹配任意空白单个符
C#字符串正则表达式基础语法
如上,所有空格被匹配上了。其余没有

(4)\d
匹配单个数字
C#字符串正则表达式基础语法
(5)\b
匹配单词的开始或结束
\bgood
C#字符串正则表达式基础语法

good\b
C#字符串正则表达式基础语法

\bgood\b
C#字符串正则表达式基础语法

(6)\W
与\w是反义,即\W匹配的是任意不是字母,数字,下划线或汉字的单个字符
C#字符串正则表达式基础语法
(7)\S
与\s是反义,即\S匹配任意不是空白的单个字符,换行符也算是空白
C#字符串正则表达式基础语法
(8)\D
与\d是反义,即\D匹配的是任意不是数字的单个字符
C#字符串正则表达式基础语法
(9)\B
与\b是反义,即\B匹配的是任意不是单词开头或结束的字符
\Bgood
C#字符串正则表达式基础语法
上述结果刚好和\b相反

(10)[^x]
匹配除了x意外的任意单个字符
[^2]
C#字符串正则表达式基础语法
上述结果除了2外其他全部匹配上了。

(11)[^good]
匹配除了good字母外外的任意单个字符
C#字符串正则表达式基础语法
(12)^和$
表示字符串的开头或者字符串的结尾。
例如:
^a?ld&
表示的是匹配一个字符串其开头有或者没有a字符,但后面肯定紧跟着ld并结束的字符串。
所以ald、old、cld、eld、都可匹配
adalde不可匹配,因为ald在中间,前面不是开始,后面也不是结束

2、转义匹配
以‘.’符号为例,上述我们提及到了‘.’匹配的是任意不为空的字符。但是如果我们就是想要匹配‘.’怎么办?
解决办法就是加上.即可。
C#字符串正则表达式基础语法
C#字符串正则表达式基础语法

3、实例

1、
I am a Apple,the old is 16.
ald
bld
cld
eld
fld
gld
ld
问:找出上述字符串中的所有包含ld的单词
答:^.?ld$
解析:
‘.’表示匹配所有不为空的单个字符
‘?’与‘.’搭配表示有或者没有即0或1都可的意思
ld表示匹配中含有这两个字母
^和$表示匹配的开始和结束
C#字符串正则表达式基础语法
注意:第一句中的old不会匹配,因为它并不是开始位置,不符合^的约束

二、正则表达式中几种重复模式

1、*
指的是重复零次或更多次

2、+
指的是重复一次货更多次

3、?
指的是重复一次或零次

4、{n}
指的是重复n次

5、{n,}
指的是重复n次或更多次

6、{n,m}
指的是重复n到m次,例如{2,4}即2个到4个均可以。

三、正则表达式中分支条件

如果匹配模式包含多种,只要满足其中一种即可的话。就将多种表达式中间用|符号隔开,即使或的意思。
如下:
0\d{2}-\d{8}|0\d{3}-\d{8}
以上两种表达式只要满足其中一种即可。值得注意的是,会存在短路现象。

四、正则表达式字符类

首先提个概念:
[]的作用是表示一个范围。
例如:
[aeiou]表示aeiou都可以
[0-4]表示01234这几个字符

常用字符类说明:
1、[0-9]\d 表示单个数字字符
2、[a-z0-9A-Z]\w 表示数字,字母汉字等
3、[aeiou] 表示aeiou都可以

又如下:
(?0\d{2}[)-]?\d{8}
其中(代表‘(’这个字符,前面的\是转义的意思

固上面的正则表达式的意思为:
匹配一个字符串,其中开头可能有(也可能没有,接着后面固定为0开头的共三位数字,接着有或者没有)或者-,最后又8个数字。
它的目的就是匹配前三个数字带括号或者中间带-的号码。
C#字符串正则表达式基础语法

五、正则表达式的分组概念&贪婪与懒惰概念

1、分组

(1)将子表达式做成子集
(2)使用()进行分组
(3)方便对match的字符串进行划分
(4)分组的命名:(?exp)
(5)(?:exp)
(6)(\d{1,3}.){3}\d{1,3} IP地址的匹配

2、贪婪和懒惰

(1)*? 重复任意次,但是尽可能少
(2)+?重复1次或更多次,但尽可能少
(3)??重复0次货
(1)贪婪 (尽可能的多)
a.*b表示匹配第一个字符为a,最后一个为b中间有0个或很多个任意非空字符。
所以aabab的结果为aabab

(2)懒惰 (尽可能的少)
a.*?b表示匹配第一个字符为a,最后一个字符为b,中间可能有多个任意非空字符可能没有。其中?是与*匹配的,这样的结果就是要么只有一个任意非空字符,要么有多个非空字符。
所以aabab的结果为aab,因为aab满足中间有一个字符。按照就

六、处理选项

1、IgnoreCase
匹配时不区分大小写

2、Multiline
更改^和$的含义,使他们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。
通常来说^和$有两个可选择的含义,一个是一个连串的单词的首和尾,
一个是一整行的首和尾,通过Multiline可以改变他们的含义,使之面向的是一整行的首和尾。

3、Singleline
更改.的含义,使它与每一个字符匹配(包括换行符\n)

4、IgnorePatternWhitespace
忽略表达式中的非转义空白并启用由#标记的注释

5、ExplicitCapture
仅补货已被显示命名的组

七、负向0宽断言

例如:查找这样一个单词–它里面出现了字母q但是后面不能跟u
表达式1:
\b\w*[^u]\w*\b

C#字符串正则表达式基础语法

上一篇:Windows 怎么知道我已经连接到互联网而不是局域网? 原来当中大有文章!


下一篇:为.net Core 3.0 WebApi 创建Linux守护进程