c#基础语言编程-正则表达式应用
引言
在不同语言中虽正则表达式一样,但应用函数还是有所区别,在c#语言中使用Regex。
可以通过以下两种方式之一使用正则表达式引擎:
- 通过调用 Regex 类的静态方法。 方法参数包含输入字符串和正则表达式模式。 正则表达式引擎会缓存静态方法调用中使用的正则表达式,这样一来,重复调用使用同一正则表达式的静态正则表达式方法将提供相对良好的性能。
- 通过实例化 Regex 对象,采用的方式是将一个正则表达式传递给类构造函数。 在此情况下,Regex 对象是不可变的(只读),它表示一个与单个正则表达式紧密耦合的正则表达式引擎。 由于未对 Regex 实例使用的正则表达式进行缓存,因此不应使用同一正则表达式实例化 Regex 对象多次。
- 可以调用 Regex 类的方法来执行下列操作:
确定字符串是否与正则表达式模式匹配。(ismatch)
提取单个匹配项或第一个匹配项。(match)
提取所有匹配项。(matches)
替换匹配的子字符串。(replace)
将单个字符串拆分成一个字符串数组。(replace)
匹配正则表达式模式
如果字符串与模式匹配,则 Regex.IsMatch 方法返回 true;如果字符串与模式不匹配,则此方法返回 false。
string[] values = { "111-22-3333", "111-2-3333"};
string pattern = @"^\d{3}-\d{2}-\d{4}$";
foreach (string value in values)
{
if (Regex.IsMatch(value, pattern))
Console.WriteLine("{0} is a valid SSN.", value);
else
Console.WriteLine("{0}: Invalid", value);
}
111-22-3333 is a valid SSN.
111-2-3333: Invalid
IsMatch()这个函数验证指定的字符串是否匹配指定的正则表达式,但是注意:
默认情况下,如果在整个字符串中只要有一部分匹配给定的字符串则返回true
一般情况下,当调用IsMatch()函数的时候都希望是完全匹配,所以在写正则的时候两边都要加^与$。
正则表达式重点是在总结字符规律,注意元字符的使用还有转义字符。
提取单个匹配项或第一个匹配项
Regex.Match 方法返回一个 Match 对象,该对象包含有关与正则表达式模式匹配的第一个子字符串的信息。
string msg = "大家好呀,hello,2010年10月10日是个好日子。恩,9494";
//逐个提取
//字符串提取Match()和Matches()
//提取第一个匹配的字符串,只提取一个。
Match match = Regex.Match(msg, @"\d+", RegexOptions.ECMAScript);
Console.WriteLine(match.Value);
Console.ReadLine();
只输出2010,如果想输出全部数字,用matches。
提取所有匹配项
Regex.Matches 方法返回一个 MatchCollection 对象,该对象包含有关正则表达式引擎在输入字符串中找到的所有匹配项的信息。
string msg = "大夫,我咳嗽得很重。” 大夫:“你多大年记?” 患者:“七十五岁。” 大夫:“二十岁咳嗽吗”患者:“不咳嗽。?";
MatchCollection matches = Regex.Matches(msg, "咳嗽");
foreach (Match item in matches)
{
Console.WriteLine(item.Index);
}
Console.WriteLine("一共出现了{0}", matches.Count);
输出3,返回的是一个集合,然后在里面逐一提取。
在捕获内容时,还有捕获组的概念,就是用括号进行表示。先写一个能满足整个字符串的正则表达式,然后在正则表达式中用括号将那些你想要提取的内容括起来,这样就可以提取你想要的组了。
string msg = "June26,1951 ";
Match match = Regex.Match(msg, @"^([a-zA-Z]+)\s*(\d{1,2})\s*,\s*(\d{4})\s*$");
Console.WriteLine(match.Groups[1].Value);
Console.WriteLine(match.Groups[2].Value);
Console.WriteLine(match.Groups[3].Value);
这样就能在全部匹配的情况下,分别获取了june 26 1951
贪婪模式
正则表达式会尽可能多的找到匹配,这就是正则表达式的贪婪模式。
终止贪婪模式: ? 具有终止贪婪模式的功能。当?出现在了另外一个限定符后的时候,表示终止贪婪模式。终止贪婪模式,表示,尽可能少的去匹配,则只匹配一个。
string msg = "1111。11。111。111111。";
//结果是全部字符串
Match match = Regex.Match(msg, "(.+)(。)");
//结果是1111。如果没有。就是1,匹配时他要尽可能匹配。
Match match = Regex.Match(msg, ".+?。");
Console.WriteLine(match.Value);
替换匹配的子字符串
Regex.Replace 方法会将与正则表达式模式匹配的每个子字符串替换为指定的字符串或正则表达式模式,并返回进行了替换的整个输入字符串。
string msg = "我的生日是05/21/2010耶我的生日是03/11/2000耶我的生日是05/21/2010耶我的生日是05/21/2010耶";
//在替换的方法中,使用提取组。 注意在引用分组的时候是使用 $1、$2、.....
msg = Regex.Replace(msg, @"(\d{2})/(\d{2})/(\d{4})", "$3-$1-$2");
反向引用
捕获组捕获到的内容,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用。反向引用的作用通常是用来查找或限定重复、查找或限定指定标识配对出现等等。在正则表达式内部,要引用内部的分组,则使用\1 \2 \3 \4 等来引用分组。
对于普通捕获组的反向引用,是通过捕获组的编号来实现的。([ab])\10
这里的“\10”会被解析成第10个捕获组的反向引用。
string msg = "你你你好好好好好好妈妈妈妈妈妈妈妈";
msg = Regex.Replace(msg, @"(.)\1+", "$1");
这个输出结果是“你好妈”,正则表达式表示含义时,找到一个字符以他未引用出现多次的进行替换,替换为反向引用的内容。
上述代码中使用了提取组的概念。
提取组:先写一个能满足整个字符串的正则表达式,然后在正则表达式 中用括号将那些想要的内容进行提取内容括起来。
小括号从左边开始数,第一个小括号就是第一组,第二个小括号就是第二组,
只数左边的括号。如没有,直接返回null。
在正则表达式应用中就是匹配、提取、替换,当然还有这几个应用的组合,要灵活应用。
c#基础语言编程-正则表达式应用的更多相关文章
- c#基础语言编程-正则表达式基础
引言 正则表达式是一种用高度抽象的字符串来描述字符串特征,进而实现对字符串的匹配.提取.替换等等.正则表达式(以下简称正则,Regex)通常不独立存在,各种编程语言和工具作为宿主语言提供对正则的支持, ...
- c#基础语言编程-程序集和反射
程序集 什么是程序集? 1.程序集(assembly)是一个及一个以上托管模块,以及一些资源文件的逻辑组合. 2.程序集是组件复用,以及实施安全策略和版本策略的最小单位. 3.程序集是包含一个或者多个 ...
- c#基础语言编程-文件流操作
引言 在System.IO 命名空间下提供了一系列的类,我们可以通过相应的类进行文件.目录.数据流的操作. 1.File类:提供用于创建.复制.删除.移动和打开文件的静态方法.File类 2.File ...
- c#基础语言编程-编码
字符编码是计算机技术的基础理论,其字符编码有ASCII码.UTF-8.还有就是GB2312,当然这是在中国常用的. 1.ASCII码 在计算机内部所有的信息都是以二进制字符进行存储.用每个二进制位中的 ...
- c#基础语言编程-Path和Directory
引言 在程序常会对文件操作,在对文件操作中需要对文件路径的进行定位,在.Net中针对寻找文件提供两个静态类以供调用,Path和Directory. Path类 来自命名空间SYstem.IO,Path ...
- c#基础语言编程-装箱和拆箱
引言 为什么有装箱和拆箱,两者起到什么作用?NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对 ...
- c#基础语言编程-多态
语言中的多态性是为了使程序有扩展性,为实现多态性,在程序中体现为接口.抽象类.父类.具体类. 接口就是一种规范,解决了多重继承的问题,类似一种规范,告诉我要做什么,具有什么能力,在接口中定义写行为属性 ...
- c#基础语言编程-序列化
引言 程序员在编写应用程序的时候往往要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯.这个将程序数据转化成能被存储并传输的格式的过程被称为" ...
- c#基础语言编程-集合
引言 在c#常用的集合分为非泛型集合和泛型集合. 非泛型集合的类和接口位于System.Collections命名空间.这些接口和类定义各种对象(如列表.队列.位数组.哈希表和字典)的集合. 泛型集合 ...
随机推荐
- hdu_1003_Max Sum
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- Win32中GDI+应用(四)--- 位图的打开与显示
显示位图,你应该使用GDI+里面的Bitmap类或者Image类,这两个类都提供了方法从硬盘上的一个文件打开文件,创建相应的内存中的位图对象的工作.然后你可以使用Graphics类的DrawImage ...
- Bootstrap 3 支持 IE8
Bootstrap 3 支持 IE8 <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries ...
- ecshop安装程序源码阅读-安装脚本(1)
定义系统判断常量 引入安装初始化文件 设置时区 报告所有错误 定义站点根常量 定义php自身相对路径 引入系统,公共函数库 引入并初始化错误处理对象 引入并初始化模板引擎 引入安装相关业务 发送HTT ...
- C#一个字符串的加密与解密
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.S ...
- nginx服务器,php-fpm重启
1.重启nginx服务器:首先whereis nginx找到你的nginx命令执行文件所在目录,直接/usr/local/nginx/sbin/nginx -s reload 这个路径可能每个人不一样 ...
- iscroll横向滑动(当前页状态标记自动变化)
var myScroll; function loaded(){ myScroll = new iScroll('wrapper',{ snap:true, checkDOMChanges:true, ...
- UML2.0统一建模语言
Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规 ...
- iOS:图像和点击事件
问题:如何区分点的是哪张图片? // // main.m // Hello // // Created by lishujun on 14-8-28. // Copyright (c) 2014年 l ...
- HTML文档模式与盒模型
HTML文档根据文档顶部的doctype声明来决定渲染模式,有标准模式(Standards Mode)与怪异模式(Quirks mode,或叫做混杂模式)两种模式. IE5及以前默认总是表现为怪异模式 ...