(6)特殊字符的匹配

string x = "//";

Regex r1 = new Regex("^////$");

Console.WriteLine("r1 match count:" + r1.Matches(x).Count);//1

Regex r2 = new Regex(@"^//$");

Console.WriteLine("r2 match count:" + r2.Matches(x).Count);//1

Regex r3 = new Regex("^//$");

Console.WriteLine("r3 match count:" + r3.Matches(x).Count);//0

//匹配“/”

string x = "/"";

Regex r1 = new Regex("^/"$");

Console.WriteLine("r1 match count:" + r1.Matches(x).Count);//1

Regex r2 = new Regex(@"^""$");

Console.WriteLine("r2 match count:" + r2.Matches(x).Count);//1

//匹配双引号

(7)组与非捕获组

string x = "Live for nothing,die for something";

string y = "Live for nothing,die for somebody";

Regex r = new Regex(@"^Live ([a-z]{3}) no([a-z]{5}),die /1 some/2$");

Console.WriteLine("x match count:" + r.Matches(x).Count);//1

Console.WriteLine("y match count:" + r.Matches(y).Count);//0

//正则表达式引擎会记忆“()”中匹配到的内容,作为一个“组”,并且可以通过索引的方式进行引用。表达式中的“/1”,用于反向引用表达式中出现的第一个组,即粗体标识的第一个括号内容,“/2”则依此类推。

string x = "Live for nothing,die for something";

Regex r = new Regex(@"^Live for no([a-z]{5}),die for some/1$");

if (r.IsMatch(x))

{Console.WriteLine("group1 value:" + r.Match(x).Groups[1].Value);//输出:thing}

//获取组中的内容。注意,此处是Groups[1],因为Groups[0]是整个匹配的字符串,即整个变量x的内容。

string x = "Live for nothing,die for something";

Regex r = new Regex(@"^Live for no(?<g1>[a-z]{5}),die for some/1$");

if (r.IsMatch(x))

{Console.WriteLine("group1 value:" + r.Match(x).Groups["g1"].Value); }//输出:thing

//可根据组名进行索引。使用以下格式为标识一个组的名称(?<groupname>…)。

string x = "Live for nothing nothing";

Regex r = new Regex(@"([a-z]+) /1");

if (r.IsMatch(x))

{x = r.Replace(x, "$1");

Console.WriteLine("var x:" + x);//输出:Live for nothing}

//删除原字符串中重复出现的“nothing”。在表达式之外,使用“$1”来引用第一个组,下面则是通过组名来引用:

string x = "Live for nothing nothing";

Regex r = new Regex(@"(?<g1>[a-z]+) /1");

if (r.IsMatch(x))

{x = r.Replace(x, "${g1}");

Console.WriteLine("var x:" + x);//输出:Live for nothing}

string x = "Live for nothing";

Regex r = new Regex(@"^Live for no(?:[a-z]{5})$");

if (r.IsMatch(x))

{Console.WriteLine("group1 value:" + r.Match(x).Groups[1].Value);//输出:(空)}

//在组前加上“?:”表示这是个“非捕获组”,即引擎将不保存该组的内容。

(8)贪婪与非贪婪

正则表达式的引擎是贪婪,只要模式允许,它将匹配尽可能多的字符。通过在“重复描述字符”(*,+)后面添加“?”,可以将匹配模式改成非贪婪。

string x = "Live for nothing,die for something";

Regex r1 = new Regex(@".*thing");

if (r1.IsMatch(x))

{Console.WriteLine("match:" + r1.Match(x).Value);

//输出:Live for nothing,die for something}

Regex r2 = new Regex(@".*?thing");

if (r2.IsMatch(x))

{Console.WriteLine("match:" + r2.Match(x).Value); //输出:Live for nothing}

(9)回溯与非回溯

使用“(?>…)”方式进行非回溯声明。由于正则表达式引擎的贪婪特性,导致它在某些情况下,将进行回溯以获得匹配

string x = "Live for nothing,die for something";

Regex r1 = new Regex(@".*thing,");

if (r1.IsMatch(x))

{Console.WriteLine("match:" + r1.Match(x).Value); //输出:Live for nothing, }

Regex r2 = new Regex(@"(?>.*)thing,");

if (r2.IsMatch(x))//不匹配

{Console.WriteLine("match:" + r2.Match(x).Value); }

//在r1中,“.*”由于其贪婪特性,将一直匹配到字符串的最后,随后匹配“thing”,但在匹配“,”时失败,此时引擎将回溯,并在“thing,”处匹配成功。在r2中,由于强制非回溯,所以整个表达式匹配失败。

(10)正向预搜索、反向预搜索

①正向预搜索声明格式:正声明 “(?=…)”,负声明 “(?!...)” ,声明本身不作为最终匹配结果的一部分.

string x = "1024 used 2048 free";

Regex r1 = new Regex(@"/d{4}(?= used)");

if (r1.Matches(x).Count==1)

{Console.WriteLine("r1 match:" + r1.Match(x).Value);//输出:1024}

Regex r2 = new Regex(@"/d{4}(?! used)");

if (r2.Matches(x).Count==1)

{Console.WriteLine("r2 match:" + r2.Match(x).Value); //输出:2048}

//r1中的正声明表示必须保证在四位数字的后面必须紧跟着“ used”,r2中的负声明表示四位数字之后不能跟有“ used”。

②反向预搜索声明格式:正声明“(?<=)”,负声明“(?<!)”,声明本身不作为最终匹配结果的一部分.

string x = "used:1024 free:2048";

Regex r1 = new Regex(@"(?<=used:)/d{4}");

if (r1.Matches(x).Count==1)

{Console.WriteLine("r1 match:" + r1.Match(x).Value);//输出:1024}

Regex r2 = new Regex(@"(?<!used:)/d{4}");

if (r2.Matches(x).Count==1)

{Console.WriteLine("r2 match:" + r2.Match(x).Value);//输出:2048}

//r1中的反向正声明表示在4位数字之前必须紧跟着“used:”,r2中的反向负声明表示在4位数字之前必须紧跟着除“used:”之外的字符串。

C#System.Text.RegularExpressions.Regex使用(二)

(11)十六进制字符范围

正则表达式中,可以使用 "/xXX" 和 "/uXXXX" 表示一个字符("X" 表示一个十六进制数)形式字符范围:

/xXX 编号在 0到255 范围的字符,比如:空格可以使用 "/x20" 表示。

/uXXXX 任何字符可以使用 "/u" 再加上其编号的4位十六进制数表示,比如:汉字可以使用“[/u4e00-/u9fa5]”表示。

(12)对[0,100]的比较完备的匹配需要特殊考虑的地方包括

*00合法,00.合法,00.00合法,001.100合法

*空字符串不合法,仅小数点不合法,大于100不合法

*数值是可带后缀的,如“1.07f”表示该值为一个float类型(未考虑)

Regex r = new Regex(@"^/+?0*(?:100(/.0*)?|(/d{0,2}(?=/./d)|/d{1,2}(?=($|/.$)))(/./d*)?)$");

(13)精确匹配有时候是困难的

有些需求要做到精确匹配比较困难,例如:日期、Url、Email地址等,其中一些你甚至需要研究一些专门的文档写出精确完备的表达式,对于这种情况,只能退而求其次,保证比较精确的匹配。例如对于日期,可以基于应用系统的实际情况考虑一段较短的时间,或者对于像Email的匹配,可以只考虑最常见的形式。

C#System.Text.RegularExpressions.Regex使用(二) .的更多相关文章

  1. .net正则表达式大全(.net 的 System.Text.RegularExpressions.Regex.Match()方法使用)

    正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串.正则表达式无疑是处理文本最有力的工具,而.NET的System.dll类库提供的System.Text.RegularExpression ...

  2. System.Text.RegularExpressions.Regex

    System.Text.RegularExpressions.Regex.IsMatch(string) 是否在指定字符串中找到制定项 System.Text.RegularExpressions.R ...

  3. C#System.Text.RegularExpressions.Regex使用(一) .

    需要引入命名空间 using System.Text.RegularExpressions;(若不引入,则写Regex时要写成 System.Text.RegularExpressions.Regex ...

  4. .NET性能系列文章二:Newtonsoft.Json vs. System.Text.Json

    微软终于追上了? 图片来自 Glenn Carstens-Peters Unsplash 欢迎来到.NET性能系列的另一章.这个系列的特点是对.NET世界中许多不同的主题进行研究.基准和比较.正如标题 ...

  5. c#字符编码,System.Text.Encoding类,字符编码大全:如Unicode编码、GB18030、UTF-8,UTF-7,GB2312,ASCII,UTF32,Big5

    本页列出来目前window下所有支持的字符编码  ---c#通过 System.Text.Encoding.GetEncodings()获取,里面可以对其进行查询,筛选,对同一个字符,在不同编码进行查 ...

  6. vs2013c#测试using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1_CXY { class Program { stati

    首先安装Unit Test Generator.方法为:工具->扩展和更新->联机->搜索“图标为装有蓝色液体的小试管.Unit Test Generator”, 编写代码,生成一个 ...

  7. ASP.NET Core 编码、web编码、网页编码 System.Text.Encodings.Web

    System.Text.Encodings.Web 空间包含表示 Web 编码器的基类.表示 HTML.JavaScript 和 Url 字符编码的子类,以及表示仅允许编码特定字符.字符范围或码位的筛 ...

  8. System.Text.Encoding.Default

    string strTmp = "abcdefg某某某";int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;/ ...

  9. [译]试用新的System.Text.Json API

    译注 可能有的小伙伴已经知道了,在.NET Core 3.0中微软加入了对JSON的内置支持. 一直以来.NET开发者们已经习惯使用Json.NET这个强大的库来处理JSON. 那么.NET为什么要增 ...

随机推荐

  1. 【一天一道LeetCode】#51. N-Queens

    一天一道LeetCode系列 (一)题目 The n-queens puzzle is the problem of placing n queens on an n×n chessboard suc ...

  2. Java序列化Serializable和Externalizable

    纸上得来终觉浅,绝知此事要躬行  --陆游       问渠那得清如许,为有源头活水来  --朱熹 什么是Java序列化?为什么出现Java序列化?怎样实现Java序列化? 一.什么是Java序列化 ...

  3. Android群英传笔记——第十章:Android性能优化

    Android群英传笔记--第十章:Android性能优化 随着Android应用增多,功能越来越复杂,布局也越来越丰富了,而这些也成为了阻碍一个应用流畅运行,因此,对复杂的功能进行性能优化是创造高质 ...

  4. OC中的枚举类型

    背景 一直对OC中的位移操作枚举不太理解,查找到两篇介绍OC中枚举的文章,觉得很不错. 什么是位移操作枚举呢? typedef NS_OPTIONS(NSUInteger, UIViewAutores ...

  5. Struts2技术内幕 读书笔记二 web开发的基本模式

    最佳实践 在讨论基本模式之前,我们先说说一个词:最佳实践 任何程序的编写都得遵循一个特定的规范.这种规范有约定俗称的例如:包名全小写,类名每个单词第一个字母大写等等等等;另外还有一些需要我们严格遵守的 ...

  6. imooc网的主体框架

    imooc网的主体框架,主要是里面的导航动画做的比较好,大家可以学习下. git地址:https://github.com/xiangzhihong/ImoocPro

  7. 属性动画基础之ValueAnimator

    概述 属性动画是谷歌在android3.0(API level 11)时候给我们带来了属性动画,真正意义上带来了"动画",以前的帧动画也就4中效果的组合(旋转.淡入淡出.放大缩小. ...

  8. How to configure ODBC DSN in Client to access remote DB2 for Windows

      How to configure ODBC DSN in Client to access remote DB2 for Windows MA Gen feng (Guangdong Unito ...

  9. jQuery学习小结

    1.jQuery hide() 和 show() 通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: $("#hide").clic ...

  10. R实战 第七篇:绘图文本表

    文本表是显示数据的重要图形,一个文本表按照区域划分为:列标题,行标题,数据区,美学特征有:前景样式.背景央视.字体.网格线等. 一,使用ggtexttable绘图文本表 载入ggpubr包,可以使用g ...