C#正则表达式
正则表达式(Regular Expression)就是用事先定义好的一些特定字符(元字符)或普通字符、及这些字符的组合,组成一个“规则字符串”,这个“规则字符串”用来判断我们给定的字符串是否匹配它的过滤逻辑,也可以从字符串中获取我们想要的特定部分。
定位元字符
-
\b 匹配单词的开始或结束.
-
\B 匹配非单词的开始或结束
-
^ 匹配必须出现在字符串的开头或行的开头
-
$ 匹配必须出现在以下位置: 字符串结尾、字符串结尾处的\n之前或行的结尾。
-
\A 指定匹配必须出 现在字符串的开头(忽略 Mutiline 选项)。
-
\z 指定匹配必须出现在字符串的结尾或字符串结尾处的\n之前(忽略Multilie选项)。
-
\G 指定匹配必须出现在上- -个匹配结束的地方。与Match.NextMatch() -起使用时,此断言确保所有匹配都是连续的。
三个括号
-
[ ],字符集合,匹配中括号内包含的任意一个字符。例如:"[abc]" 可以匹配 "plain" 的 'a'。
-
( ),提取组,改变运算的优先级。
-
{ },{n},匹配确定的 n 次。例如:'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o;
{n,},至少匹配 n 次。例如:'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "fooood" 中的所有 o;
{n,m},其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 'o'。
简化正则表达式
-
\d,匹配一个数字字符。等价于 [0-9];
-
\W,匹配任何非单词字符。等价于 [^A-Za-z0-9_];
-
*, 匹配前面的子表达式零次或多次。例如:zo* 能匹配 "z" 以及 "zoo"。等价于{0,};
-
+, 匹配前面的子表达式一次或多次。例如:'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。等价于 {1,};
-
?, 匹配前面的子表达式零次或一次。例如:"do(es)?" 可以匹配 "do" 或 "does" 中的 "do"。等价于 {0,1}。
@符号的作用
目的是为了不让编译器去解析其中的转义字符,,而作为正则表达式语法(元字符)存在。
常用的4种方法
1、Regex.Matches() --提取多个匹配
//TODO 提取字符串中所有的数字
var list = Regex.Matches("2015年12月06日8点40分", @"\d+");//匹配所有数字
foreach (Match item in list)
{
Console.WriteLine(item.Value);
}
2、Regex.IsMatch() --判断是否匹配
//判断是否为11位数字的电话号码
var result = Regex.IsMatch("12345678912", @"^[0-9]{11}$");
Console.WriteLine(result);
3、Regex.Replace() --替换匹配内容
//TODO 将手机中间四位变成*号
var strNew = Regex.Replace("13666688888", @"(\d{3})\d{4}(\d{4})", "$1****$2");//"$1"表示第一个小括号里的 ,$2是第2个小括号里的
Console.WriteLine(strNew);
4、Regex.Split() --根据匹配分割字符串
//TODO 提取字符串中所有英文名
var strArr = Regex.Split("Jack123Tom345Mary345Amy", @"\d+");
foreach (var item in strArr)
{
Console.WriteLine(item);
}