【后端开辟】C#之正则表达式引见

本文整顿C#正则表达式的元字符,正则表达式是由字符构成的表达式,每一个字符代表一个划定规矩,表达式中的字符分为两种范例:一般字符和元字符。一般字符是指字面寄义稳定的字符,依据完整婚配的体式格局婚配文本,而元字符具有特别的寄义,代表一类字符。

把文本看做是字符流,每一个字符放在一个位置上,比方,正则表达式 “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网别的相干文章!

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注