目录
一、前期准备
二、元字符
三、反义字符
四、重复模式
五、符号应用
六、贪婪与懒惰
七、零宽断言
八、反向引用
九、处理选项
十、平衡组/递归匹配
涉及知识点: 正则表达式、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部分 |
如有错误,烦请批评指正