C#之正则表达式介绍

本文整理c#正则表达式的元字符,正则表达式是由字符构成的表达式,每个字符代表一个规则,表达式中的字符分为两种类型:普通字符和元字符。普通字符是指字面含义不变的字符,按照完全匹配的方式匹配文本,而元字符具有特殊的含义,代表一类字符。

C#之正则表达式介绍

把文本看作是字符流,每个字符放在一个位置上,例如,正则表达式 “Roomddd”,前面四个字符Room是普通字符,后面的字符是转义字符,和后面的字符d组成一个元字符d,表示该位置上有任意一个数字。

C#之正则表达式介绍

用正则表达式的语言来描述是:正则表达式 “Roomddd”共捕获7个字符,表示“以Room开头、以三个数字结尾”的一类字符串,我们把这一类字符串称作一个模式(Pattern),也称作是一个正则。

一,转义字符

转义字符是,把普通字符转义为具有特殊含义的元字符,常用的转义字符有:

:水平制表符:垂直制表符:回车:换行\:表示字符 ,也就说,把转义字符 转义为普通的字符 “:表示字符 “,在C#中,双引号用于定义字符串,字符串包含的双引号用 ” 来表示

二,字符类

在进行正则匹配时,把输入文本看作是有顺序的字符流,字符类元字符匹配的对象是字符,并会捕获字符。所谓捕获字符是指,一个元字符捕获的字符,不会被其他元字符匹配,后续的元字符只能从剩下的文本中重新匹配。

常用的字符类元字符:

[ char_group]:匹配字符组中的任意一个字符[^char_group]:匹配除字符组之外的任意一个字符[first-last]:匹配从first到last的字符范围中的任意一个字符,字符范围包括first和last。.   :通配符,匹配除之外的任意一个字符w:匹配任意一个单词(word)字符,单词字符通常是指A-Z、a-z和0-9W:匹配任意一个非单词字符,是指除A-Z、a-z和0-9之外的字符s:匹配任意一个空白字符S:匹配任意一个非空白字符d:匹配任意一个数字字符D:匹配任意一个非数字字符

注意,转义字符也属于字符类元字符,在进行正则匹配时,也会捕获字符。

三,定位符

定位符匹配(或捕获)的对象是位置,它根据字符的位置来判断模式匹配是否成功,定位符不会捕获字符,是零宽的(宽度为0),常用的定位符有:

^:默认情况下,匹配字符串的开始位置;在多行模式下,匹配每行的开始位置;$:默认情况下,匹配字符串的结束位置,或 字符串结尾的之前的位置;在多行模式下,匹配每行结束之前的位置,或者每行结尾的之前的位置。A:匹配字符串的开始位置;Z:匹配字符串的结束位置,或 字符串结尾的之前的位置;z:匹配字符串的结束位置;G:匹配上一个匹配结束的位置;:匹配一个单词的开始或结束的位置;B:匹配一个单词的中间位置;

 C#之正则表达式介绍

四,量词、贪婪和懒惰

量词是指限定前面的一个正则出现的次数,量词分为两种模式:贪婪模式和懒惰模式,贪婪模式是指匹配尽可能多的字符,而懒惰模式是指匹配尽可能少的字符。默认情况下,量词处于贪婪模式,在量词的后面加上?来启用懒惰模式。

*:出现0次或多次+:出现1次或多次?:出现0次或1次{n}:出现n次{n,}:出现至少n次{n,m}:出现n到m次

注意,出现多次是指前面的元字符出现多次,例如,d{2} 等价于 dd,只是出现两个数字,并不要求两个数字是相同的。要表示相同的两个数字,必须使用分组来实现。

C#之正则表达式介绍

五,分组和捕获字符

()  括号不仅确定表达式的范围,还创建分组,()内的表达式就是一个分组,引用分组表示两个分组匹配的文本是完全相同的。定义一个分组的基本语法:

(pattern)

该类型的分组会捕获字符,所谓捕获字符是指:一个元字符捕获的字符,不会被其他元字符匹配,后续的元字符只能从剩下的文本中重新匹配。

1,分组编号和命名

默认情况下,每个分组自动分配一个组号,规则是:从左向右,按分组左括号的出现顺序进行编号,第一个分组的组号为1,第二个为2,以此类推。也可以为分组指定名称,该分组称作命名分组,命名分组也会被自动编号,编号从1开始,逐个加1,为分组指定名称的语法是:

(?name > pattern)

通常来说,分组分为命名分组和编号分组,引用分组的方式有:

通过分组名称来引用分组:k通过分组编号来引用分组:umber

注意,分组只能后向引用,也就是说,从正则表达式文本的左边开始,分组必须先定义,然后才能在定义之后面引用。

在正则表达式里引用分组的语法为“umber”,比如“”代表与分组1 匹配的子串,“”代表与分组2 匹配的字串,以此类推。

例如,对于 “.*?>” 可以匹配 

valid

,在引用分组时,分组对应的文本是完全相同的。

2,分组构造器

分组构造方法如下:

(pattern):捕获匹配的子表达式,并为分组分配一个组号(? pattern):把匹配的子表达式捕获到命名的分组中(?:pattern):非捕获的分组,并未分组分配一个组号(?> pattern):贪婪分组

3,贪婪分组

贪婪分组也称作非回溯分组,该分组禁用了回溯,正则表达式引擎将尽可能多地匹配输入文本中的字符。如果无法进行进一步的匹配,则不会回溯尝试进行其他模式匹配。

(?> pattern )

4,二选一

| 的意思是或,匹配两者中的任意一个,注意,|把左右两边的表达式分为两部分。

pattern1 | pattern2

登录后复制

六,零宽断言

零宽是指宽度为0,匹配的是位置,所以匹配的子串不会出现在匹配结果中,而断言是指判断的结果,只有断言为真,才算匹配成功。

对于定位符,可以匹配一句话的开始、结束(^ $)或者匹配一个单词的开始、结束(),这些元字符只匹配一个位置,指定这个位置满足一定的条件,而不是匹配某些字符,因此,它们被成为 零宽断言。所谓零宽,指的是它们不与任何字符相匹配,而匹配一个位置;所谓断言,指的是一个判断,正则表达式中只有当断言为真时才会继续进行匹配。零宽断言可以精确的匹配一个位置,而不仅仅是简单的指定句子或者单词。

正则表达式把文本看作从左向右的字符流,向右叫做后向(Look behind),向左叫做前向(Look ahead)。对于正则表达式,只有当匹配到指定的模式(Pattern)时,断言为True,叫做肯定式,把不匹配模式为True,叫做否定式。

按照匹配的方向和匹配的定性,把零宽断言分为四种类型:

(?= pattern):前向、肯定断言(?! pattern):前向、否定断言(?(?

 1,前向肯定断言

前向肯定断言定义一个模式必须存在于文本的末尾(或右侧),但是该模式匹配的子串不会出现在匹配的结果中,前向断言通常出现在正则表达式的右侧,表示文本的右侧必须满足特定的模式:

 (?= subexpression )

使用前向肯定断言可以定一个模糊匹配,后缀必须包含特定的字符:

w+(?=sis)

登录后复制

对正则表达式进行分析:

:表示单词的边界 w+:表示单词至少出现一次(?=sis):前向肯定断言,s 表示一个空白字符, is 是普通字符,完全匹配, 是单词的边界。

从分析中,可以得出,匹配该正则表达式的文本中必须包含 is 单词,is是一个单独的单词,不是某一个单词的一个部分。举个例子

Sunday is a weekend day 匹配该正则,匹配的值是Sunday,而The island has beautiful birds 不匹配该正则。

2,后向肯定断言

后向肯定断言定义一个模式必须存在于文本的开始(或左侧),但是该模式匹配的子串不会出现在匹配的结果中,后向断言通常出现在正则表达式的左侧,表示文本的左侧必须满足特定的模式:

(?<= subexpression )

登录后复制

使用后向肯定断言可以定一个模糊匹配,前缀必须包含特定的字符:

(?<=20)d{2}

登录后复制

对正则表达式进行分析:

(?d{2}:表示两个数字,数字不要求相同:单词的边界

该正则表达式匹配的文本具备的模式是:文本以20开头、以两个数字结尾。

推荐学习:C#.Net教程

以上就是C#之正则表达式介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2436150.html

(0)
上一篇 2025年3月3日 10:34:00
下一篇 2025年3月3日 10:34:15

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 浅谈C#方法的六种参数

    c#方法的参数有六种,分别是值参数、引用参数、输出参数、参数数组、命名参数、可选参数。下面本篇文章就来给大家介绍一下,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 值参数 值参数是方法的默认类型,通过复制实参的值到形参的…

    2025年3月3日 编程技术
    200
  • c++如何实现字符串分割函数split?(代码示例)

    在学习c++++中string相关基本用法的时候,发现了sstream的istringstream[1]可以将字符串类似于控制台的方式进行输入,而实质上这个行为等同于利用空格将一个字符串进行了分割。 于是考虑到可以利用这个特性来实现c++库…

    2025年3月3日
    200
  • c++怎么将字符串转数字

    c++++怎么将字符串转数字? C++字符串转化为数字的库函数 1、atoi 功 能:把一字符串转换为整数 用 法:int atoi(const char *nptr); 立即学习“C++免费学习笔记(深入)”; 详细解释:atoi是英文a…

    2025年3月3日
    200
  • const在c++中的意思

    c++onst在c++中的意思     const是一个C语言的关键字。 const 是constant的缩写,本意是不变的,不易改变的意思。 const 在C++中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。 cons…

    2025年3月3日
    200
  • c++如何从函数返回数组

    c++++如何从函数返回数组? C++ 从函数返回数组 C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下: …

    2025年3月3日
    200
  • c++如何设置全局变量

    c++++如何设置全局变量? 1、首先,定义一个实现加法运算自定义函数。 2、接着,定义一个实现乘法运算的自定义函数。 立即学习“C++免费学习笔记(深入)”; 3、最后,在主函数中实现程序的运算。 4、定义在函数外部没有被花括号括起来的变…

    2025年3月3日 编程技术
    200
  • C#中DataSet的用法

    c#中dataset的用法 DataSet类是ADO.NET中最核心的成员之一,也是各种开发基于.Net平台程序语言开发数据库应用程序最常接触的类。每一个DataSet都有很多个DataTables和Relationships。Relati…

    2025年3月3日
    200
  • c++ vector用法详解

    c++++ vector用法详解 vector 是C++ STL的一个重要成员,使用它时需要包含头文件: #include; 登录后复制 一、vector 的初始化:可以有五种方式,举例说明如下: 推荐:《C++教程》     (1) ve…

    2025年3月3日
    200
  • dev c++怎么改语言

    dev c++++怎么改语言? 方法如下: 推荐:《C++教程》 1、点菜单栏Tools(工具); 2、选择 Environment Options(环境选项) -> Interface(界面)选项卡; 立即学习“C++免费学习笔记(…

    2025年3月3日
    200
  • devc++怎么调背景

    devc++++怎么调背景? 点击打开Dev-C++,如图所示: 推荐:《C++教程》 点击打开之后,弹出如图所示界面: 立即学习“C++免费学习笔记(深入)”; 点击菜单栏中的工具栏,如图所示: 点击工具栏——>编辑器选项,如图所示…

    2025年3月3日 编程技术
    200

发表回复

登录后才能评论