C#中如何使用正则表达式-创新互联

今天就跟大家聊聊有关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

看完上述内容,你们对C# 中如何使用正则表达式有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联成都网站设计公司行业资讯频道,感谢大家的支持。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


标题名称:C#中如何使用正则表达式-创新互联
本文链接:http://hbruida.cn/article/gjpos.html