(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. java组播MulticastSocket

    在单播模式中有服务器端和客户端之分,而组播模式与单播模式不同,每个端都是以路由器或交换机做为中转广播站,任意一端向路由器或交换机发送消息,路由或交换机负责发送其他节点,每个节点都是同等的.所以在编程模 ...

  2. Android Studio 从安装到配置使用

    Android Studio是谷歌为android量身定制的IDE,在2013年谷歌大会上提出之后一直持续更新,现在已经是功能十分强劲的android开发工具,作为一个android开发者,还是早点转 ...

  3. java工具类(三)之生成若干位随机数

    java 生成若干位随机数的问题 在一次编程的过程中偶然碰到一个小问题,就是需要生成一个4位数的随机数,如果是一个不到4位大的数字,前面可以加0来显示.因为要求最后是一个4位的整数,不带小数点.当时就 ...

  4. 【资源分享】云计算 CRM 等网上搜集资料

    持续更新,作为抛砖引玉,如果您有更好.更新的资源,望大家分享.共同学习.详细信息尽在 华夏编程社区(HackProLabs)-------------------------------------- ...

  5. iOS雷达图 iOS RadarChart实现

    实现效果 刚拿到设计稿的时候大概看了一眼,当时心里想着放张背景图,然后计算下相应点的坐标,在最上面画一层就OK了,其实一开始实现的时候也确实是这么做的,然后我就日了狗了,发现设计稿上多层五边形的间隔不 ...

  6. 43个优秀的Swift开源项目推荐

    "轮子" 工具类 项目 开发者 备注 SwiftyJSON tangplin, lingoer GitHub 上最为开发者认可的 JSON 解析类 Dollar.swift Ank ...

  7. Linux - quota的举例说明

    实作 Quota 流程-1:文件系统支持 [root@www ~]# df -h /home Filesystem Size Used Avail Use% Mounted on /dev/hda3 ...

  8. SharePoint 2013 页面访问,Url中间多一段&quot;_layouts/15/start.aspx#&quot;

    问题描述: 我想访问如下页面 http://Host/_layouts/15/ManageFeatures.aspx 点击以后页面地址没有错,但是中间多了一段"_layouts/15/sta ...

  9. 做自己的软件的Gallery(一)

    先上效果图: 如图,android默认也有Gallery,很多软件在调用时,都是使用自己的Gallery,一方面好维护,另外一方面可以做优化.要做成以上样式,图片加载类起至关重要,一不小心,就好OOM ...

  10. HBase事务

    众所周知,ACID是指原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持久性(Durability). HBase对同一行数据的操作提供ACID保证.HB ...