C# 正则表达式进阶

.NET 中的正则表达式是基于 Perl 5 的正则表达式。

超时

从 .NET Framework 4.5 开始,正则表达式支持在匹配操作中指定超时时间。如果匹配超时,就会抛出 RegexMatchTimeoutException。

所有方法都增加了带超时时间参数的重载:

public static Match Match(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);

public static MatchCollection Matches(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);

public static string Replace(string input, string pattern, string replacement, RegexOptions options, TimeSpan matchTimeout);

public static string[] Split(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);

如果应用程序需要处理任意的正则表达式(例如在高级搜索对话框中)则务必使用该参数以防止一些恶意的正则表达式导致无限计算。

编译正则表达式

RegexOptions.Compiled 选项将会使 Regex 实例通过轻量级的代码生成器动态地构建并编译针对特定正则表达式的代码,提高匹配速度。

模式修正符

模式修正符不仅可以打开,还可以关闭。如下示例,先打开忽略大小写,再关闭忽略大小写,所以匹配结果是 Aa。

Regex.Match("AAAa", "(?i)a(?-i)a").Value;  // Aa

零宽断言

现在要写一个用于验证密码是否符合要求的正则表达式,要求是至少包含一个数字。

这个很简单,如下就可以了

Regex.IsMatch("12345678", "\d");

现在加一个条件,长度要大于 6 位。似乎用一个正则无法实现。

其实是可以的,用零宽断言中的 正向先行断言 就可以了。

正向先行断言 (?=exp),一般用来匹配 exp 之前的内容。例如下面个例子,要取出姓名,需要匹配 , 之前的内容。

Regex.Match("姓名张三,男,30 岁", "(?<=姓名).*?(?=,)").Value; // 张三

其实,正确的理解是:正向先行断言,匹配成功之后,会退回起始位置,然后继续之后的匹配。

这里最重要的一点是,匹配成功以后退回起始位置,所以,对它正确的理解是,一个前向条件判断。

那么上面的密码至少包含一个数字,且长度大于 6 就好实现了:

Regex.IsMatch("abcde6", @"(?=.*\d).{6,}");

我们再增加一点难度,密码要求符合如下条件:

  • 至少 8 位
  • 至少包含一个数字
  • 至少包含一个小写字母
  • 至少包含一个大写字母
string pattern = @"(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}";
Regex.IsMatch("12345678", pattern); // false
Regex.IsMatch("1234567a", pattern); // false
Regex.IsMatch("123456aA", pattern); // true

分割字符串

分割字符串分隔符不会包含在结果中,若要将分隔符包含在结果中,则可以将表达式包含在正前向条件中。

foreach (string s in Regex.Split("oneTwoThree", "(?=[A-Z])"))
  Console.WriteLine(s);

// one
// Two
// Three

分组

正则表达式中可以通过 \n 语法来引用索引为 n 的分组。

var m = Regex.Matches("pop pope peep", @"\b(\w)\w+\1\b");

// pop
// peep

命名捕获分组语法:
(?'组名'表达式) 或 (?<组名>表达式)

引用命名分组语法:
\k'组名' 或 \k<组名>

替换并分割文本

替换字符串可以通过 $0 作为替代结构访问原始的匹配。$1、$2 访问任意捕获的分组。对于命名分组,可以通过 ${name} 的方式进行访问。

给所有数字加上 <>:

Console.WriteLine(Regex.Replace("1 + 11 = 12", @"\d+", @"<$0>"));
// <1> + <11> = <12>

MatchEvaluator 委托

Replace 方法有一个重载,使用 MatchEvaluator 委托作为参数,替代 replacement。该委托将对每个匹配执行一次,并使用其返回结果替换原字符串中的值。

MatchEvaluator 委托定义:

public delegate string MatchEvaluator(Match match);

示例:

Console.WriteLine(Regex.Replace("1 + 11 = 12", @"\d+", m => (int.Parse(m.Value) * 10).ToString()));

// 10 + 110 = 120

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#匹配中文字符串的4种正则表达式分享

    本文介绍在C#中使用匹配中文的正则表达式,包括纯中文.有中文.中文开头.中文结尾等几个正则表达式示例.在正则表达式中,中文可以通过Unicode编码来确定正则表达式范围. 在C#中,匹配中文的正则表达式用Unicode来表示时,范围是: [\u4e00-\u9fa5].所以,在此基础上,我们可以得到如下一些正则表达式. 1.匹配字符串全部是中文字符的正则表达式 复制代码 代码如下: "^[\u4e00-\u9fa5]+$" 说明:"^"表示字符串开头,"$

  • C# 正则表达式 使用介绍

    为了避免以后这样的情况,在此记录下正则表达式的一些基本使用方法附带小的实例.让以后在使用时能一目了然知道他的使用,为开发节约时间,同时也分享给大家 正则元字符 在说正则表达式之前我们先来看看通配符,我想通配符大家都用过.通配符主要有星号(*)和问号(?),用来模糊搜索文件.winodws中我们常会使用搜索来查找一些文件.如:*.jpg,XXX.docx的方式,来快速查找文件.其实正则表达式和我们通配符很相似也是通过特定的字符匹配我们所要查询的内容信息.已下代码都是区分大小写. 常用元字符 代码

  • C#正则表达式之Regex类用法详解

    Regex 类表示不可变(只读)的正则表达式.它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类. 正则表达式基础概述 什么是正则表达式 在编写字符串的处理程序时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码. 通常,我们在使用WINDOWS查找文件时,会使用通配符(*和?).如果你想查找某个目录下的所有Word文档时,你就可以使用*.doc进行查找,在这里,*就被解释为任意字符串.和通配

  • C#正则表达式匹配与替换字符串功能示例

    本文实例讲述了C#正则表达式匹配与替换字符串功能.分享给大家供大家参考,具体如下: 事例一:\w+=>[A-Za-z1-9_],\s+=>任何空白字符,()=>捕获 string text = @"public string testMatchObj string s string match "; string pat = @"(\w+)\s+(string)"; // Compile the regular expression. Regex

  • C#使用正则表达式实例

    正则表达式可以被看成是一个强大的通配符(通用匹配符号).大多数人都应该很熟悉通配符,例如,当我们看到一个诸如"SAMS"的表达式,那么一个文本串中任何以SAMS开头的字符串都可以与这个表达式匹配.正则表达式提供了比这种通配符能力更强.控制规则更复杂.功能更完善的匹配机制. 本文将对.NET框架提供的支持正则表达式的类做一个概要介绍.要想获得有关正则表达式的更多知识,可参考<Regular Expression Pocket Reference >(O'Reilly Medi

  • C#正则表达式使用方法示例

    第一步先要引入有关正则式的命名空间: 复制代码 代码如下: using System.Text.RegularExpressions; 第二步用指定的正则式构建一个正则表达式对象,下面的正则式是用来搜索长度为10的a-z的英文字母: 复制代码 代码如下: Regex obj = new Regex("[a-z]{10}"); 最后,根据正则式在指定数据中检索匹配项,如果匹配IsMatch方法就会返回true. 复制代码 代码如下: MessageBox.Show(obj.IsMatch

  • 常用正则 常用的C#正则表达式

    常用的C#正则表达式! "^\d+$" //非负整数(正整数 + 0)  "^[0-9]*[1-9][0-9]*$" //正整数  "^((-\d+)|(0+))$" //非正整数(负整数 + 0)  "^-[0-9]*[1-9][0-9]*$" //负整数  "^-?\d+$" //整数  "^\d+(\.\d+)?$" //非负浮点数(正浮点数 + 0)  "^(([0-9

  • C#中的正则表达式双引号问题

    其中如果包含的字符串中包含双引号,那么就两个双引号表示,而不是反斜杠加上双引号(\"),也不是斜杠加上双引号(/") 正则表达式获取CSS里面的图片的例子,里面有URL里面的图片地址有双引号,要注意用两个双引号""表示 static void Main(string[] args) { Regex reg = new Regex(@"url\((['""]?)(.+[^'""])\1\)"); //注意里面

  • C# 正则表达式进阶

    .NET 中的正则表达式是基于 Perl 5 的正则表达式. 超时 从 .NET Framework 4.5 开始,正则表达式支持在匹配操作中指定超时时间.如果匹配超时,就会抛出 RegexMatchTimeoutException. 所有方法都增加了带超时时间参数的重载: public static Match Match(string input, string pattern, RegexOptions options, TimeSpan matchTimeout); public sta

  • 正则表达式 学习参考 推荐入门者看

    1       概述 正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征. 正如自然语言中"高大"."坚固"等词语抽象出来描述事物特征一样,正则表达式就是字符的高度抽象,用来描述字符串的特征. 正则表达式(以下简称正则,Regex)通常不独立存在,各种编程语言和工具作为宿主语言提供对正则的支持,并根据自身语言的特点,进行一定的剪裁或扩展. 正则入门很容易,有限的语法规则很容易掌握,但是目前正则的普及率并不高,主要是因为正则的流派

  • 正则表达式学习参考 正则入门学习资料

    1 概述 正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征. 正如自然语言中"高大"."坚固"等词语抽象出来描述事物特征一样,正则表达式就是字符的高度抽象,用来描述字符串的特征. 正则表达式(以下简称正则,Regex)通常不独立存在,各种编程语言和工具作为宿主语言提供对正则的支持,并根据自身语言的特点,进行一定的剪裁或扩展. 正则入门很容易,有限的语法规则很容易掌握,但是目前正则的普及率并不高,主要是因为正则的流派众多,各种宿

  • 浅谈C#中正则表达式的使用

    目前为止,许多编程语言和工具都包含对正则表达式的支持,C#也不例外,C#基础类库中包含有一个命名空间(System.Text.RegularExpressions)和一系列可以充分发挥规则表达式威力的类(Regex.Match.Group等).那么,什么是正则表达式,怎么定义正则表达式呢? 一.正则表达式基础 什么是正则表达式 在编写字符串的处理程序时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码. 通常,我们在使用

  • javascript 进阶篇1 正则表达式,cookie管理,userData

    首先,什么事正则表达式呢,其实引入概念很多时候并不能帮我们明白它到底是什么,所以我先简单描述下,正则表达式,其实就是一个记录字符串规则则的字符串,等我们看完这一部分,也就能明白它到底是什么了. 基本语法:正则表达式就是"/expression/"+表示搜索范围的符号.例如我们要找function这个关键词,就是/function/gi,其中g表示global,就是全局搜索,i表示ignor,就是忽略大小写. 在js中,我们通过RegExp类来实现. 这个类里面有很多很多的符号用来表示不

  • Python进阶篇之正则表达式常用语法总结

    目录 正则表达式概述 1.点-匹配所有字符 2.星号-重复匹配任意次 3.加号-重复匹配多次 4. 花括号-匹配指定次数 5. 问号-贪婪模式和非贪婪模式 6.方括号-匹配几个字符之一 7.起始位置和单行.多行模式 8.括号-组选择 9.反斜杠-对元字符的转义 10.修饰符-可选标志 11.使用正则表达式切割字符串 正则表达式概述 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模

  • Java 正则表达式入门详解(基础进阶)

    正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符").模式描述在搜索文本时要匹配的一个或多个字符串 先来两篇基础知识对于以前没了解过正则表达式的朋友可以先看下面两篇文章 1.正则表达式30分钟入门教程 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它. 2.正则表达式基本语法详解 Java 正则表达式 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于

  • 老生常谈Java字符串进阶(必看篇)

    前言 最常用的对字符串操作的类有三个,分别是String,StringBuilder,StringBuffer,下面将会详细的说说这三个类...... String String类代表字符串,这个是最基本的对字符串的类,这个也是使用比较多的类,这里就不再详细介绍了 构造 new String(String str) new String(StringBuilder str) new String(StringBuffer str) new String(byte[] bys,String cha

  • Python使用中文正则表达式匹配指定中文字符串的方法示例

    本文实例讲述了Python使用中文正则表达式匹配指定中文字符串的方法.分享给大家供大家参考,具体如下: 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理. 往往一个具有普适性的正则表达式会简化程序和代码的处理,使过程简洁和事半功倍,这往往是高手和菜鸟最显著的差别.

  • 读懂正则表达式就这么简单

    一 前言 对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学,因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云. 其实只是对正则不了解而以,了解了你就会发现,原来就这样啊正则所用的相关字符其实不多,也不难记,更不难懂,唯一难的就是组合起来之后,可读性比较差,而且不容易理解,本文旨在让大家对正则有一个基本的了解,能看得懂简单的正则表达式,写得出简单的正则表达式,用以满足日常开发中的需求即可. 0\d{2}-\d{8}|0\d{3}-\d{7} 先来一段

随机推荐