.NET 中的正则表达式是基于 Perl 5 的正则表达式。正则表达式
从 .NET Framework 4.5 开始,正则表达式支持在匹配操做中指定超时时间。若是匹配超时,就会抛出 RegexMatchTimeoutException
。lua
全部方法都增长了带超时时间参数的重载:code
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
。input
Regex.Match("AAAa", "(?i)a(?-i)a").Value; // Aa
如今要写一个用于验证密码是否符合要求的正则表达式,要求是至少包含一个数字。string
这个很简单,以下就能够了it
Regex.IsMatch("12345678", "\d");
如今加一个条件,长度要大于 6 位。彷佛用一个正则没法实现。io
实际上是能够的,用零宽断言中的 正向先行断言 就能够了。编译
正向先行断言 (?=exp)
,通常用来匹配 exp 以前的内容。例以下面个例子,要取出姓名,须要匹配 ,
以前的内容。
Regex.Match("姓名张三,男,30 岁", "(?<=姓名).*?(?=,)").Value; // 张三
其实,正确的理解是:正向先行断言,匹配成功以后,会退回起始位置,而后继续以后的匹配。
这里最重要的一点是,匹配成功之后退回起始位置,因此,对它正确的理解是,一个前向条件判断。
那么上面的密码至少包含一个数字,且长度大于 6 就好实现了:
Regex.IsMatch("abcde6", @"(?=.*\d).{6,}");
咱们再增长一点难度,密码要求符合以下条件:
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>
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