C#正则表达式元字符详解_后端开发

    后端开发 后端开发 11个月前 (11-29) 45次浏览 已收录 0个评论 扫描二维码

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

    C#正则表达式元字符详解_后端开发

    把文本看做是字符流,每一个字符放在一个位置上,比方,正则表达式 “Room\d\d\d”,前面四个字符Room是一般字符,背面的字符\是转义字符,和背面的字符d构成一个元字符\d,示意该位置上有恣意一个数字。

    C#正则表达式元字符详解_后端开发

    用正则表达式的言语来形貌是:正则表达式 “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:婚配一个单词的中心位置;

    C#正则表达式元字符详解_后端开发

    四、量词、贪欲和懒散

    量词是指限制前面的一个正则涌现的次数,量词分为两种形式:贪欲形式和懒散形式,贪欲形式是指婚配尽量多的字符,而懒散形式是指婚配尽量少的字符。默许情况下,量词处于贪欲形式,在量词的背面加上?来启用懒散形式。

    *:涌现0次或屡次

    +:涌现1次或屡次

    ?:涌现0次或1次

    {n}:涌现n次

    {n,}:涌现最少n次

    {n,m}:涌现n到m次

    注重,涌现屡次是指前面的元字符涌现屡次,比方,\d{2} 等价于 \d\d,只是涌现两个数字,并不请求两个数字是雷同的。要示意雷同的两个数字,必需运用分组来完成。

    C#正则表达式元字符详解_后端开发

    五、分组和捕捉字符

    () 括号不仅一定表达式的局限,还建立分组,()内的表达式就是一个分组,援用分组示意两个分组婚配的文本是完整雷同的。定义一个分组的基础语法:

    (pattern)

    该范例的分组会捕捉字符,所谓捕捉字符是指:一个元字符捕捉的字符,不会被其他元字符婚配,后续的元字符只能从剩下的文本中从新婚配。

    1、分组编号和定名

    默许情况下,每一个分组自动分派一个组号,划定规矩是:从左向右,按分组左括号的涌现递次举行编号,第一个分组的组号为1,第二个为2,以此类推。也可认为分组指定称号,该分组称作定名分组,定名分组也会被自动编号,编号从1入手下手,逐一加1,为分组指定称号的语法是:

    (?< name > pattern)

    一般来讲,分组分为定名分组和编号分组,援用分组的体式格局有:

    经由过程分组称号来援用分组:\k<name>

    经由过程分组编号来援用分组:\number

    注重,分组只能后向援用,也就是说,从正则表达式文本的左边入手下手,分组必需先定义,然后才能在定义之背面援用。

    在正则表达式里援用分组的语法为“\number”,比方“\1”代表与分组1 婚配的子串,“\2”代表与分组2 婚配的字串,以此类推。

    比方,关于 “<(.*?)>.*?</\1>” 能够婚配 <h2>valid</h2>,在援用分组时,分组对应的文本是完整雷同的。

    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开头、以两个数字末端。

    七,用正则从花样化的文本中扣值

    有以下的JSON花样的文本,从文本中扣出字段(CustomerId、CustomerName、CustomerIdSource和CustomerType)的值:

    {"CustomerDetails":"[{\"CustomerId\":\"57512f19\",\"CustomerName\":\"cust xyz\",\"CustomerIdSource\":\"AadTenantId\",\"CustomerType\":\"Enterprise\"}]"}

    注重,该文本转换为C#中的字符时,需要对双引号和转义字符举行转义。因为这四个字段提取划定规矩雷同,能够写一个通用的形式来提取:

    public static string GetNestedItem(string txt, string key)
    {
        string pat = string.Format("(?<=\\\\\"{0}\\\\\":\\\\\").*?(?=\\\\\")", key);
        return Regex.Match(txt, pat, RegexOptions.IgnoreCase).Value;
    }

    正则表达式得剖析:

    (?<=\\\\\”{0}\\\\\”:\\\\\”):后向断言,用于婚配字段名、双引号和冒号

    .*?:懒散形式,婚配尽量少的文本

    (?=\\\\\”):前向断言,用于婚配字段值得双引号

    本文来自 C#.Net教程 栏目,迎接进修!

    以上就是C#正则表达式元字符详解的细致内容,更多请关注ki4网别的相干文章!

    喜欢 (0)
    [1353713598@qq.com]
    分享 (0)
    发表我的评论
    取消评论
    表情 贴图 加粗 删除线 居中 斜体 签到

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址