目录
C# 正则表达式Regex
正则表达式提供了功能强大、灵活而又高效的方法来处理文本。 正则表达式丰富的泛模式匹配表示法使你可以快速分析大量文本,以便:
- 查找特定字符模式。
- 验证文本以确保它匹配预定义模式(如电子邮件地址)。
- 提取、编辑、替换或删除文本子字符串。
- 将提取的字符串添加到集合中,以便生成报告。
对于处理字符串或分析大文本块的许多应用程序而言,正则表达式是不可缺少的工具。
来自微软官方
1. c#的正则表达式基本构成
使用正则表达式处理文本的中心构件是正则表达式引擎,处理文本至少要求向该正则表达式引擎提供以下两方面的信息:
- 要在文本中标识的正则表达式模式
- 要为正则表达式模式分析的文本
using System.Text.RegularExpressions;
Regex reg = new Regex(@"\d+");
Match match = reg.Match("a55a");
if (match.Success)
{
Console.WriteLine(match.Value);
}
上面的示例给出了一个基本的正则表达式查找流程。
2. 正则表达式模式
2.1 正则表达式中的定位点
^
表示匹配出现在字符串开头
$
表示匹配出现在字符串末尾,或出现在输入字符串末尾的 \n
之前
\b
表示匹配在字符边界
\z
匹配仅出现在字符串的末尾,多行字符串仅仅匹配最后一行,不匹配字符串末尾的\n
\Z
匹配必须出现在字符串的末尾,或出现在字符串末尾的 \n
之前
\A
匹配必须仅出现在字符串的开头位置(无多行支持)
\G
匹配必须从上一个匹配结束的位置开始;如果以前没有匹配项,则从开始进行匹配的字符串中的位置开始。
2.2 字符类
字符类表示的是一类字符,匹配的时候只要和字符类中的任意一个匹配就是满足条件
字符类 | 描述 | 模式 | 匹配 |
---|---|---|---|
[character_group] |
匹配 character_group 中的任何单个字符。 默认情况下,匹配区分大小写。 | [ae] |
"gray" 中的 "a" "lane" 中的 "a" 和 "e" |
[^character_group] |
求反:与不在 character_group 中的任何单个字符匹配。 默认情况下, character_group 中的字符区分大小写。 | [^aei] |
"reign" 中的 "r" 、"g" 和 "n" |
[first-last] |
字符范围:与从第一个至最后一个的范围内的任何单个字符匹配。 | [A-Z] |
"AB123" 中的 "A" 和 "B" |
. |
通配符:与除 \n 之外的任何单个字符匹配。 若要匹配文本句点字符(. 或 \u002E ),你必须在该字符前面加上转义符 (\. )。 |
a.e |
"nave" 中的 "ave" "water" 中的 "ate" |
\p{name} |
与 name 指定的 Unicode 通用类别或命名块中的任何单个字符匹配。 | \p{Lu} \p{IsCyrillic} |
"City Lights" 中的 "C" 和 "L" "ДЖem" 中的 "Д" 和 "Ж" |
\P{name} |
与不在 name 指定的 Unicode 通用类别或命名块中的任何单个字符匹配。 | \P{Lu} \P{IsCyrillic} |
"City" 中的 "i" 、"t" 和 "y" "ДЖem" 中的 "e" 和 "m" |
\w |
与任何单词字符匹配。 | \w |
"ID A1.3" 中的 "I" 、"D" 、"A" 、"1" 和 "3" |
\W |
与任何非单词字符匹配。 | \W |
"ID A1.3" 中的 " " 和 "." |
\s |
与任何空白字符匹配。 | \w\s |
"ID A1.3" 中的 "D " |
\S |
与任何非空白字符匹配。 | \s\S |
"int __ctr" 中的 " _" |
\d |
与任何十进制数字匹配。 | \d |
"4 = IV" 中的 "4" |
\D |
与任何不是十进制数的字符匹配。 | \D |
"4 = IV" 中的 " " 、"=" 、" " 、"I" 和 "V" |
2.3 分组
分组构造描述了正则表达式的子表达式,通常用于捕获输入字符串的子字符串。
分组构造 | 描述 | 模式 | 匹配 |
---|---|---|---|
(subexpression) |
捕获匹配的子表达式并将其分配到一个从 1 开始的序号中。 | (\w)\1 |
"deep" 中的 "ee" |
(?<name>subexpression) 或 (?'name'subexpression) |
将匹配的子表达式捕获到一个命名组中。 | (?<double>\w)\k<double> |
"deep" 中的 "ee" |
2.4 数量词
限定符 | 描述 | 模式 | 匹配 |
---|---|---|---|
* |
匹配上一个元素零次或多次。 | a.*c |
"abcbc" 中的 "abcbc" |
+ |
匹配上一个元素一次或多次。 | "be+" |
"been" 中的 "bee" 、"bent" 中的 "be" |
? |
匹配上一个元素零次或一次。 | "rai?" |
"rain" 中的 "rai" |
{n} |
匹配上一个元素恰好 n 次。 | ",\d{3}" |
"1,043.6" 中的 ",043" 、"9,876,543,210" 中的 ",876" 、",543" 和 ",210" |
{n,} |
匹配上一个元素至少 n 次。 | "\d{2,}" |
"166" , "29" , "1930" |
{n,m} |
匹配上一个元素至少 n 次,但不多于 m 次。 | "\d{3,5}" |
"166" , "17668" "193024" 中的 "19302" |
*? |
匹配上一个元素零次或多次,但次数尽可能少。 | a.*?c |
"abcbc" 中的 "abc" |
+? |
匹配上一个元素一次或多次,但次数尽可能少。 | "be+?" |
"been" 中的 "be" 、"bent" 中的 "be" |
?? |
匹配上一个元素零次或一次,但次数尽可能少。 | "rai??" |
"rain" 中的 "ra" |
{n}? |
匹配前面的元素恰好 n 次。 | ",\d{3}?" |
"1,043.6" 中的 ",043" 、"9,876,543,210" 中的 ",876" 、",543" 和 ",210" |
3. 正则表达式的执行方法
- 通过调用
Regex.IsMatch
方法确定输入文本中是否具有正则表达式模式。 - 通过调用
Regex.Match
或Regex.Matches
方法检索匹配正则表达式模式的一个或所有文本匹配项。 - 通过调用
Regex.Replace
方法替换匹配正则表达式模式的文本。