目录
一、前期准备
二、元字符
三、反义字符
四、重复模式
五、符号应用
六、贪婪与懒惰
七、零宽断言
八、反向引用
九、处理选项
十、平衡组/递归匹配
涉及知识点: 正则表达式、Regex、Match
一、前期准备
static void Main(string[] args)
{
Regex regex = new Regex(@".");
string input = "a2 N王";
Match match1 = regex.Match(input);
while (match1.Success)
{
Console.Write( match1.Groups[0].Value + "_" );
match1 = match1.NextMatch();
}
}
二、元字符
元字符 | 说明 | 单词全拼 |
---|
. | 匹配除换行符以外的任意字符 | |
\w | 匹配字母或数字或下划线或汉字 | word(单词) |
\s | 匹配任意空白符 | space(空) |
\d | 匹配数字 | digit(数字) |
\b | 匹配单词的开始或结束 | begin(开始) break(结束) |
^ | 匹配字符串的开始 | |
$ | 匹配字符串的结束 | |
例程:
注: \b 查找字符串中的单词
^ $ 查找整个字符串 -- 一般用于验证整个字符串
Regex regex = new Regex(@"\b...\b");
string input = "A1a 89 2 w";
//结果显示: A1a_ 89_2 _
Regex regex = new Regex(@"\b\w\d\b");
string input = "A1a 89 2 w1 a";
//结果显示: 89_w1_
Regex regex = new Regex(@"\b\s\w\b");
string input = "A1a 89 2 w1 a";
//结果显示: 2_ a_
Regex regex = new Regex(@"^\w\w\w\d\d");
string input = "abc12";
//结果显示:abc12_
三、反义字符
提示:元字符取反 = 反义字符
语法 | 说明 |
\W | 匹配任意不是字母, 数字, 下划线, 汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou 这几个字母以外的任意字符 |
四、重复模式
语法 | 说明 |
* | 前面一个字符,重复0次或更多 |
+ | 前面一个字符,重复1次或更多 |
? | 前面一个字符,可有,可无 |
{n} | 前面一个字符,重复n次 |
{n,} | 前面一个字符,重复n次或更多 |
{n,m} | 前面一个字符,重复n到m次 |
例程:
Regex regex = new Regex(@"a*b");
string input = "b ab aab cc";
//结果显示:b_ab_aab_
Regex regex = new Regex(@"a+b");
string input = "b ab aab cc";
//结果显示:ab_aab_
Regex regex = new Regex(@"\bab?\b");
string input = "a b ab aab cc";
//结果显示:a_ab_
Regex regex = new Regex(@"\ba{1}b\b");
string input = "a b ab aab aaab cc";
//结果显示:ab_
Regex regex = new Regex(@"\ba{1,}b\b");
string input = "a b ab aab aaab cc";
//结果显示:ab_aab_aaab_
Regex regex = new Regex(@"\ba{1,2}b\b");
string input = "a b ab aab aaab cc";
//结果显示:ab_aab_
五、符号应用
符号 | 说明 |
[] | 符合中括号里面的任意字符即可 |
() | 将括号里面的字符看着是一个整体 |
| | 或运算 |
^ | 在中括号中,表示取反 |
?#xxx | 注释,内容:xxx |
六、贪婪与懒惰
默认:贪婪模式
重复模式 + ?= 懒惰模式
语法 | 说明 |
*? | 重复0次或更多次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次, 但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
例程:
Regex regex = new Regex(@"\w+b");
string input = "ababaab aabab cc";
//结果显示:ababaab_aabab_
Regex regex1 = new Regex(@"\w+?b");
string input1 = "ababaab aabab cc";
//结果显示:ab_ab_aab_aab_ab_
七、零宽断言
语法 | 说明 |
?= x | 提取后缀为x的字符,x不提取 |
?<=x | 提取以x开头的字符,x不提取 |
?!x | 提取 不等于x的字符,x可以为空 |
例程:
Regex regex = new Regex(@"\w+(?=ing)");
string input = "wsidg qering aing scing cc";
//结果显示:qer_a_sc_
Regex regex = new Regex(@"(?<=q)\w+");
string input = "wsidg qering aing scing cc";
//结果显示:ering_
Regex regex = new Regex(@"q(?!a)\w+");
string input = "wsidg qer qaw qw er q";
//结果显示:qer_qw_
八、反向引用
注:1、重复的单词要相同
2、前面单词需要用小括号括起来
例程 | 解析 |
\b(\w+)\b\s+\1\b | \1 代表前面的一个单词 |
\b(?<Word>\w+)\b\s+\k<Word>\b | \k<Word> 代指前面一个 |
Regex regex = new Regex(@"\b(q\w)\b\s+\1\b");
string input = "wsidg qa qa qb qb qr q";
//结果显示:qa qa_qb qb_
Regex regex = new Regex(@"\b(?<key>q\w)\b\s+\k<key>\b");
string input = "wsidg qa qa qb qb qr q";
//结果显示:qa qa_qb qb_
九、处理选项
语法 | 说明 |
IgnoreCase | 匹配时不区分大小写 |
Multiline | 更改^ 和 $ 的含义, $匹配从结尾改为\n |
Singleline | 更改.的含义, 使他与每一个字符匹配(包括\n) |
IgnorePatterWhitespace | 忽略非转义空白并其余#标记的注释 |
ExplicitCapture | 仅捕获已被显式命名的组 |
十、平衡组/递归匹配
语法 | 说明 |
(?'group') | 捕获的内容命名为group,压入堆栈中 |
(?'-group') | 弹出最后压入命名为group的内容 |
(?(group)yes|no) | 存在继续匹配yes部分,否则匹配no部分 |
如有错误,烦请批评指正