求教C#正则表达式

作者&投稿:系标 (若有异议请与网页底部的电邮联系)
求 C# Winform 使用正则表达式的方法~

string pattern = @"^\d{2}$";// 定义正则表达式 ," "里面的是表达式

Match m = Regex.Match(textBox1.Text, pattern);// 匹配正则表达式

if (m.Success)
{
MessageBox.Show("y");
}
else
{
MessageBox.Show("n");
}

正则表达式是(?i)[/da-f){2},不过像是有问题,解释如下:
(?i)表示英文字母大小写不敏感,即大小写均可
[/da-f]表示单个字符允许的集合,写成这个样子则允许/、a-f共13个字符,说它有问题是指/应该是\,则\d表示0-9,那样的话,就允许0-9、a-f共16个字符
{2}表示连续出现两次
综上,意图大约是匹配一个字节的16进制表示,但因\误用为/,匹配意图似乎没有什么意义。

什么是正则表达式
在编写字符串的处理程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
通常,我们在使用WINDOWS查找文件时,会使用通配符(*和?)。如果你想查找某个目录下的所有Word文档时,你就可以使用*.doc进行查找,在这里,*就被解释为任意字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂。
l 一个简单的例子——验证电话号码
学习正则表达式的最好方法是从例子开始,下面我们从验证电话号码开始,一步一步的了解正则表达式。
在我们国家,电话号码(如:0379-65624150)通常包含3到4为以0开头的区号和一个7或8为的号码,中间通常以连字符’-’隔开。在这个例子中,首先我们要介绍一个元字符\d,它用来匹配一个0到9的数字。这个正则表达式可以写成:^0\d{2,3}-\d{7,8}$
我们来对他进行分析,0匹配数字“0”,\d匹配一个数字,{2,3}表示重复2到3次,-只匹配”-”自身,接下来的\d同样匹配一个数字,而 {7,8}则表示重复7到8次。当然,电话号码还可以写成 (0379)65624150,这里就交给读者完成。
l 元字符
在上面的例子中,我们接触到了一个元字符\d,正如你所想的,正则表达式还有很多像\d一样的元字符,下表列出了一些常用的元字符:

元字符

说明

.

匹配除换行符以外的任意字符

\b

匹配单词的开始或结束

\d

匹配数字

\s

匹配任意的空白符

\w

匹配字母或数字或下划线或汉字

^

匹配字符串的开始

$

匹配字符串的结束

表1、常用的元字符
l 转义字符
如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\.
例如:unibetter\.com匹配unibetter.com,C:\\Windows匹配C:\Windows。
l 限定符
限定符又叫重复描述字符,表示一个字符要出现的次数。比如我们在匹配电话号码时使用的{3,4}就表示出现3到4次。常用的限定符有:

限定符

说明

*

重复零次或更多次

+

重复一次或更多次

?

重复零次或一次

{n}

重复n次

{n,}

重复n次或更多次

{n,m}

重复n到m次

表2、常用的限定符
二、.NET中正则表达式的支持
System.Text.RegularExpressions 命名空间包含一些类,这些类提供对 .NET Framework 正则表达式引擎的访问。该命名空间提供正则表达式功能,可以从运行在 Microsoft .NET Framework 内的任何平台或语言中使用该功能。

1、在C#中使用正则表达式
在了解了C#中支持正则表达式的类后,我们一起来将上面提到的验证电话号码的正则表达式写入C#代码中,实现电话号码的验证。
第一步,建立一个名为SimpleCheckPhoneNumber的Windows项目。
第二步,引入System.Text.RegularExpressions命名空间。
第三步,写出正则表达式。这里的正则表达式就是上面的验证号码的字符串。由于上面的字符串只能验证用连字符连接区号和号码的方式的电话号码,所以我们做了一些修改:0\d{2,3}-\d{7,8}|\(0\d{2,3}\)\d{7,8}。在这个表达式中,| 号面的一部分是我们上面提到过的,后面一部分是用来验证(0379)65624150这种电话号码写法的。由于 ( 和 ) 也是元字符,所以要用转义字符。| 表示分支匹配,要么匹配前面的一部分,要么匹配后面的一部分。
第四步,正则表达式构造一个Regex类。
第五步,使用Regex类的IsMatch方法验证匹配。Regex类的IsMatch()方法返回一个bool值,如果有匹配项,返回true,否则返回false。
、正则表达式进阶
l 分组
在匹配电话号码的时候,我们已经用到过重复单个字符。下面我们来了解如何使用分组来匹配一个IP地址。
众所周知,IP地址是四段点分十进制的字符串表示的。所以,我们可以通过地址的分组,来进行匹配。首先,我们来匹配第一段:2[0-4]\d|25[0-5]|[01]?\d\d? 这段正则表达式可以匹配IP地址的一段数字。2[0-4]\d 匹配以2开头,十位为0到4,个位为任何数字的三位字段,25[0-5] 匹配以25 开头,个位为0到5 的三位字段,[01]?\d\d? 匹配任何以1者0头,个位和十位为任何数子的字段。? 表示出现零次或一次。所以, [01] 和 最后一个 \d 都可以不出现,如果我们再向这个字符串后面添加一个 \. 来匹配 . 就可以划分一个段了。现在,我们把 2[0-4]\d|25[0-5]|[01]?\d\d?\. 当做一个分组,就可以写成 (2[0-4]\d|25[0-5]|[01]?\d\d?\.) 。接下来我们就来使用这个分组。将这个分组重复两次,然后,再使用 2[0-4]\d|25[0-5]|[01]?\d\d? 就可以了。完整的正则表达式为: (2[0-4]\d|25[0-5]|[01]?\d\d?\.){3}2[0-4]\d|25[0-5]|[01]?\d\d?

l 后向引用
在我们了解分组以后,我们就可以使用后向引用了。所谓后向引用,就是使用前面捕获的结果,对后面的字符进行匹配。多用于匹配重复字符。比如匹配 go go 这样的重复字符。我们就可以使用 (go) \1来进行匹配。
默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。当然,你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\w+)(或者把尖括号换成'也行:(?'Word'\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k<Word>,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b。
自定义组名还有另外一个好处,在我们的C#程序中,如果需要得到分组的值,我们就可以很明确的使用我们定义的分组的名字来得到,而不必使用下标。
当我们并不想使用后向引用时,是不需要捕获组记忆任何东西的,这种情况下就可以利用(?:nocapture)语法来主动地告诉正则表达式引擎,不要把圆括号的内容当作捕获组,以便提高效率。
l 零宽断言
在前面的元字符介绍中,我们已经知道了有这样一类字符,可以匹配一句话的开始、结束(^ $)或者匹配一个单词的开始、结束(\b)。这些元字符只匹配一个位置,指定这个位置满足一定的条件,而不是匹配某些字符,因此,它们被成为 零宽断言。所谓零宽,指的是它们不与任何字符相匹配,而匹配一个位置;所谓断言,指的是一个判断。正则表达式中只有当断言为真时才会继续进行匹配。
在有些时候,我们精确的匹配一个位置,而不仅仅是句子或者单词,这就需要我们自己写出断言来进行匹配。下面是断言的语法:

断言语法

说明

(?=pattern)

前向肯定断言,匹配pattern前面的位置

(?!pattern)

前向否定断言,匹配后面不是pattern的位置

(?<=pattern)

后向肯定断言,匹配pattern后面的位置

(?<!pattern)

后向否定断言,匹配前面不是pattern的位置

表3、断言的语法及说明
很难理解吗?我们来看一个例子。
有一个标签:<book>,我们想要得到标签<book>的标签名(book),这个时候,我们就可以使用断言来处理。看下面这个表达式:(?<=\<)(?<tag>\w*)(?=\>) ,使用这个表达式,可以匹配< 和 >之间的字符,也就是这里的book。使用断言还还可以写出更加复杂的表达式,这里就不再举例了。
还有一点非常重要,就是断言语法所使用的圆括号并不作为捕获组,所以不能使用编号或命名来对它进行引用。

l 贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。来看一下这个表达式:a\w*b ,用它来匹配字符串 aabab 时,得到的匹配结果是 aabab 。这种匹配被称为贪婪匹配。
有些时候,我们希望让它尽可能的少重复,即用上面的例子得到的匹配结果是 aab,这时我们就要使用懒惰匹配。懒惰匹配需要在重复限定符的后面添加一个 ? 符号,上面的表达式就可以写成:a\w*?b 我们再来匹配字符串 aabab时,得到的匹配结果是 aab 和 ab。
也许这个时候你要问,ab 比aab重复次数更少,为什么不先匹配ab呢?其实在正则表达式中还有比贪婪/懒惰优先级更高的规则:最先开始的匹配拥有最高的优先权——The match that begins earliest wins。
l 注释
语法:(?#comment)
例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)
注意:如果使用注释,则需要格外注意不要在注释的小括号前面出现空格、换行符等一些字符,如果可以忽略这些字符,则最好使用“忽略模式里的空白符”选项,即C#中RegexOptions枚举的IgnorePatternWhitespace选项(C#中的RegexOptions枚举下面将会提到)。

l C#中的处理选项
在C#中,可以使用RegexOptions 枚举来选择C#对正则表达式的处理方式。下面是MSDN中RegexOptions 枚举的成员介绍:

l C#中Capture类、Group类、Match类
Capture类:表示单个子表达式捕获中的结果。Capture类表示单个成功捕获中的一个子字符串。该类没有公共构造函数,可以从Group类或者Match类中得到一个Capture类的对象集合。Capture类有三个常用属性,分别是Index、Length和Value。Index表示捕获的子字符串的第一个字符的位置。Length表示捕获的子字符串的长度,Value表示捕获的子字符串。
Group类:表示正则表达式中分组的信息。该类提供了对分组匹配的正则表达式的支持。该类没有公共构造函数。可以从Match类中得到一个Group类的集合。如果正则表达式中的分组已命名,则可以使用名字对其进行访问,如果没有命名,则可以采用下标访问。注意:每一个Match的Groups集合中的第0个元素(Groups[0])都是这个Match捕获的字符串,也是Capture的Value。
Match类:表示单个正则表达式匹配的结果。该类同样没有公共构造函数,可以从Regex类的Match()方法得到该类的一个实例,也可以使用Regex类的Matches()方法得到给类的一个集合。
这三个类都能表示单个正则表达式匹配的结果,但Match类得到的更为详细,包含捕获和分组信息。所以,Match类在这个三个类中是最常用的。


c老师是一种什么体验
C老师是指教授C语言课程的教师。C语言是一门基础且重要的编程语言,广泛应用于操作系统、编译器、硬件驱动等领域。因此,成为一名C老师不仅需要具备扎实的编程基础,还需要对计算机科学有深入的了解。在教学过程中,C老师需要不断更新自己的知识体系,以应对学生不断变化的学习需求和问题。他们需要设计出一...

c语言学习教程哪个好
C语言的基础教程,可以分为四个部分:变量、表达式、控制结构、函数。在学习C语言的基本知识之前,应该先了解这四个部分。变量是C语言中用来表示数据的容器,可以用来存储各种类型的数据,如整数、浮点数、字符串等。而表达式则是用来操作变量的语句,控制结构是用来控制程序执行顺序的语句,而函数则是用来...

C语言学习资源整理赶快收藏
C语言的整型溢出问题 酷 壳- CoolShellcn 易被遗忘的C\/C++要点总结 C\/C++的mem函数和strcpy函数的区别和应用 C语言的变量作用域及头文件 10个经典的C语言面试基础算法及代码 四、其他资源 再整理一些资源,零七碎八的,我想对干学习C语言的过程中会很有帮助的。awesome-c(英文)、awesome-c-cn(中...

最好最全的c人教程
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可...

c语言编程怎样入门
(2)动起手来--立马安装VC++6.0或VS开发环境 C语言是特别注重动手实操能力的课程!!动起手来,现在开始安装VC++6.0开发环境,从第一个经典程序“Hello,world!”开始,每一个例题及知识点均通过开发环境验证、理解深化。多做每一章小型实验操作(网上多得很)。提升代码调试能力。(3)有了基础...

最好最全的c教程
外文书名: C Programming:A Modern Approach,Second Edition。丛书名: 图灵程序设计丛书。平装: 600页。正文语种: 简体中文。开本: 16。ISBN: 9787115219572。条形码: 9787115219572。尺寸: 25.8 x 18.2 x 3 cm。重量: 1.1 Kg。作者:(美国)金(K.N.King) 译者:吕秀锋 黄倩。K. N. King ...

C语言全套教学视频
C语言程序设计 链接:https:\/\/pan.baidu.com\/s\/1lz9auia1FNkY8RTHW3g1Zg 提取码:8uar复制这段内容后打开百度网盘手机APP,操作更方便哦!若资源有问题欢迎追问~

c语言教学教案7篇
c语言教学教案篇1 活动目标: 1、理解故事内容,懂得为大家做好事,自己也会得到快乐的道理。 2、能运用故事中的语言完整地回答问题。 3、愿意与别人交流。 4、引导幼儿在故事和游戏中学习,感悟生活。 5、能自由发挥想像,在集体面前大胆讲述。 活动准备: 知识经验:初步了解植物的生长。 环境材料:根据故事绘制图片...

C语言程序设计课程讲什么内容?
课程通过学习C语言编程的基础语法,对程序设计有一个基本的认识,为后续计算机专业课程以及面向对象程序设计课程的学习打下基础。课程主要内容:C语言程序基本结构及相关概念、变量、函数、语句、if条件语句、switch条件语句、for循环语句、while循环语句、数组、指针、字符串、结构体。

什么时候中国大学开始c语言教学的?
1989年出现第一个标准,即C89.1991年,清华大学第一个开始C语言教程,使用教材为谭浩强编写的《C语言程序设计》第一版(1991),由清华大学出版社出版。1992年,包括哈尔滨工业大学在内的十几所高校开始C语言教学。到了21世纪,C语言已经成为大多数高校计算机专业,软件设计专业等专业的必修课程。

泊头市13860365102: C#中正则表达式 [([^]]*)] 是什么意思??? -
钭芳银杏: 这个是匹配以"["开头同时以"]"结尾的字符串,而且在"[]"中间不能出现字符"]" \[ 代表开头是[ \] 代表结尾时] ([^]])^在中括号中是取反,所以在整个字符串中不能出现"]"*代表多个字符.希望能帮到你

泊头市13860365102: 求C#正则表达式,包含字母,数字,加减乘除,括号,大于,等于,小数点等等 -
钭芳银杏: 示例 字符串:string a="hello"; string b="world"; string c=a+b;//c="helloworld" 加减乘除:int a=6; int b=3; int d=(int)a/b; int[] c={a+b,a-b,a*b,d};/* c[0]=9 c[1]=3; c[2]=18; c[3]=2;*//*=赋值==判断相等&和 |或*/ 小数点.我用的是Visual C#,是否能帮助到你?

泊头市13860365102: C#里边的正则表达式 -
钭芳银杏: 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:ns*r 评注:可以用来删除空白行 匹配HTML标记的正则表达式:]*>.*?| 评注:网上流传的版...

泊头市13860365102: C# 求正则表达式写法 -
钭芳银杏: 先取出一个括号的内容 String str = Regex.Match("*{**|**|**}*", "(?<={)[^}]+").Value 之后进行3个判断:1.str中没有 "||"2.str首尾字符不是"|"3.str中有3个"|"

泊头市13860365102: C#正则表达式是什么呀?怎么用? -
钭芳银杏: 正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容 C#中 主要的正则类 就是 Regex ! Regex regex = new Regex("a{1,2}"); Match m = regex.Match("123abc456") if(m.Success) { ////// }

泊头市13860365102: 常用的C#正则表达式? -
钭芳银杏: "^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\d+)|(0+))$" //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$" //负整数 "^-?\d+$" //整数 "^\d+(\.\d+)?$" //非负浮点数(正浮点数 + 0) "^(([0-9]+\.[0-9]*[1-9][...

泊头市13860365102: 求C#正则表达式 -
钭芳银杏: [^"]*)"title="(?[^"]*)

泊头市13860365102: 求解正则表达式 C#
钭芳银杏: try.. Match m = Regex.Match( "SELECT(S1,TABLE,S1=\ "CC\ ") ", @ "SELECT\((.*?),(.*?),(.*?)\) "); if (m.Success) { string str1 = m.Groups[1].ToString(); string str2 = m.Groups[2].ToString(); string str3 = m.Groups[3].ToString(); }

泊头市13860365102: 求一个C#的正则表达式 -
钭芳银杏: 假设你要赋值的变量分别为a,b string x = "【独步】涂鸦 (4)(2)【詺簰】麦田 "; Regex r = new Regex(@"^[^\n]*?\((\d+)\)[^\n]*?\((\d+)\)[^\n]*?$"); if (r.IsMatch(x)) {// Console.WriteLine("" + r.Match(x).Groups[1].Value +"," r.Match(x)....

泊头市13860365102: C# 求一条正则表达式 -
钭芳银杏: 如果是按你说的呢.就是这样 ^[+-\d]*$ 可以匹配:-1+5-3+8之类的 如果只希望正负数呢 ^[+-]??\d*$ 允许包含小数 ^[+-]??\d*(\.\d+)??$

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网