把文本看做是字符流,每一个字符放在一个位置上,比方,正则表达式 “Room\d\d\d”,前面四个字符Room是一般字符,背面的字符\是转义字符,和背面的字符d构成一个元字符\d,示意该位置上有恣意一个数字。
用正则表达式的言语来形貌是:正则表达式 “Room\d\d\d”共捕捉7个字符,示意“以Room开首、以三个数字末端”的一类字符串,我们把这一类字符串称作一个形式(Pattern),也称作是一个正则。
一,转义字符
转义字符是\,把一般字符转义为具有特别寄义的元字符,经常运用的转义字符有:
\t
:程度制表符\v
:垂直制表符\r
:回车\n
:换行\\
:示意字符 \,也就说,把转义字符 \ 转义为一般的字符 \\"
:示意字符 ",在C#中,双引号用于定义字符串,字符串包含的双引号用 \" 来示意
二,字符类
在举行正则婚配时,把输入文本看做是有递次的字符流,字符类元字符婚配的对象是字符,并会捕捉字符。所谓捕捉字符是指,一个元字符捕捉的字符,不会被其他元字符婚配,后续的元字符只能从剩下的文本中从新婚配。
经常运用的字符类元字符:
[ char_group]
:婚配字符组中的恣意一个字符[^char_group]
:婚配除字符组以外的恣意一个字符[first-last]
:婚配从first到last的字符局限中的恣意一个字符,字符局限包含first和last。.
:通配符,婚配除\n以外的恣意一个字符\w
:婚配恣意一个单词(word)字符,单词字符一般是指A-Z、a-z和0-9\W
:婚配恣意一个非单词字符,是指除A-Z、a-z和0-9以外的字符\s
:婚配恣意一个空缺字符\S
:婚配恣意一个非空缺字符\d
:婚配恣意一个数字字符\D
:婚配恣意一个非数字字符
注重,转义字符也属于字符类元字符,在举行正则婚配时,也会捕捉字符。
三,定位符
定位符婚配(或捕捉)的对象是位置,它依据字符的位置来推断形式婚配是不是胜利,定位符不会捕捉字符,是零宽的(宽度为0),经常运用的定位符有:
^
:默许情况下,婚配字符串的最先位置;在多行形式下,婚配每行的最先位置;$
:默许情况下,婚配字符串的完毕位置,或 字符串末端的\n之前的位置;在多行形式下,婚配每行完毕之前的位置,或许每行末端的\n之前的位置。\A
:婚配字符串的最先位置;\Z
:婚配字符串的完毕位置,或 字符串末端的\n之前的位置;\z
:婚配字符串的完毕位置;\G
:婚配上一个婚配完毕的位置;\b
:婚配一个单词的最先或完毕的位置;\B
:婚配一个单词的中心位置;
四,量词、贪欲和懒散
量词是指限制前面的一个正则涌现的次数,量词分为两种形式:贪欲形式和懒散形式,贪欲形式是指婚配尽量多的字符,而懒散形式是指婚配尽量少的字符。默许情况下,量词处于贪欲形式,在量词的背面加上?来启用懒散形式。
*
:涌现0次或屡次+
:涌现1次或屡次?
:涌现0次或1次{n}
:涌现n次{n,}
:涌现最少n次{n,m}
:涌现n到m次
注重,涌现屡次是指前面的元字符涌现屡次,比方,\d{2} 等价于 \d\d,只是涌现两个数字,并不请求两个数字是雷同的。要示意雷同的两个数字,必需运用分组来完成。
五,分组和捕捉字符
() 括号不仅一定表达式的局限,还建立分组,()内的表达式就是一个分组,援用分组示意两个分组婚配的文本是完整雷同的。定义一个分组的基础语法:
(pattern)
该范例的分组会捕捉字符,所谓捕捉字符是指:一个元字符捕捉的字符,不会被其他元字符婚配,后续的元字符只能从剩下的文本中从新婚配。
1,分组编号和定名
默许情况下,每一个分组自动分派一个组号,划定规矩是:从左向右,按分组左括号的涌现递次举行编号,第一个分组的组号为1,第二个为2,以此类推。也可认为分组指定称号,该分组称作定名分组,定名分组也会被自动编号,编号从1最先,逐一加1,为分组指定称号的语法是:
(?<
name>
pattern)
一般来讲,分组分为定名分组和编号分组,援用分组的体式格局有:
- 经由过程分组称号来援用分组:\k<name>
- 经由过程分组编号来援用分组:\number
注重,分组只能后向援用,也就是说,从正则表达式文本的左边最先,分组必需先定义,然后才能在定义之背面援用。
在正则表达式里援用分组的语法为“\number”,比方“\1”代表与分组1 婚配的子串,“\2”代表与分组2 婚配的字串,以此类推。
比方,关于 "<(.*?)>.*?</\1>" 能够婚配 <p>valid</p>,在援用分组时,分组对应的文本是完整雷同的。
2,分组组织器
分组组织要领以下:
(pattern)
:捕捉婚配的子表达式,并为分组分派一个组号(?< name > pattern):把婚配的子表达式捕捉到定名的分组中
(?:pattern):非捕捉的分组,并未分组分派一个组号
(?> pattern):贪欲分组
3,贪欲分组
贪欲分组也称作非回溯分组,该分组禁用了回溯,正则表达式引擎将尽量多地婚配输入文本中的字符。假如没法举行进一步的婚配,则不会回溯尝试举行其他形式婚配。
(?> pattern )
4,二选一
|
的意义是或,婚配二者中的恣意一个,注重,|
把摆布双方的表达式分为两部份。
pattern1 | pattern2
六,零宽断言
零宽是指宽度为0,婚配的是位置,所以婚配的子串不会涌现在婚配效果中,而断言是指推断的效果,只要断言为真,才算婚配胜利。
关于定位符,能够婚配一句话的最先、完毕(^ $)或许婚配一个单词的最先、完毕(\b),这些元字符只婚配一个位置,指定这个位置满足一定的前提,而不是婚配某些字符,因而,它们被成为 零宽断言。所谓零宽,指的是它们不与任何字符相婚配,而婚配一个位置;所谓断言,指的是一个推断,正则表达式中只要当断言为真时才会继续举行婚配。零宽断言能够准确的婚配一个位置,而不仅仅是简朴的指定句子或许单词。
正则表达式把文本看做从左向右的字符流,向右叫做后向(Look behind),向左叫做前向(Look ahead)。关于正则表达式,只要当婚配到指定的形式(Pattern)时,断言为True,叫做一定式,把不婚配形式为True,叫做否认式。
依据婚配的方向和婚配的定性,把零宽断言分为四种范例:
(?=
pattern):前向、一定断言
(?!
pattern):前向、否认断言
(?<=
pattern):后向、一定断言
(?<!
pattern):后向、否认断言
1,前向一定断言
前向一定断言定义一个形式必需存在于文本的末端(或右边),然则该形式婚配的子串不会涌现在婚配的效果中,前向断言一般涌现在正则表达式的右边,示意文本的右边必需满足特定的形式:
(?=
subexpression)
运用前向一定断言能够定一个隐约婚配,后缀必需包含特定的字符:
\b\w+(?=\sis\b)
对正则表达式举行剖析:
\b
:示意单词的边境-
\w
+:示意单词最少涌现一次 (?=\sis\b)
:前向一定断言,\s 示意一个空缺字符, is 是一般字符,完整婚配,\b 是单词的边境。
从剖析中,能够得出,婚配该正则表达式的文本中必需包含 is 单词,is是一个零丁的单词,不是某一个单词的一个部份。举个例子
Sunday is a weekend day 婚配该正则,婚配的值是Sunday,而The island has beautiful birds 不婚配该正则。
2,后向一定断言
后向一定断言定义一个形式必需存在于文本的最先(或左边),然则该形式婚配的子串不会涌现在婚配的效果中,后向断言一般涌现在正则表达式的左边,示意文本的左边必需满足特定的形式:
(?<= subexpression )
运用后向一定断言能够定一个隐约婚配,前缀必需包含特定的字符:
(?<=\b20)\d{2}\b
对正则表达式举行剖析:
(?<=\b20)
:后向断言,\b示意单词的最先,20是一般字符\d{2}
:示意两个数字,数字不请求雷同\b
:单词的边境
该正则表达式婚配的文本具有的形式是:文本以20开首、以两个数字末端。
引荐进修:C#.Net教程
以上就是C#之正则表达式引见的细致内容,更多请关注ki4网别的相干文章!