之前项目里面一直使用正则表达式,然而对于正则的语法只有基本的了解,这二天采点时间学习一下基本知识
1. 正则表达式字符含义
1.1. 元字符
元字符语法
代码 | 说明 |
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
1.2. 反义
反义语法
代码 | 说明 |
\W | 匹配任意不是字母、数字、下划线、汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除x以外的任意字符 |
[^aeiou] | 匹配除aeiou几个字母以外的任意字符 |
1.3. 重复
重复语法
代码 | 说明 |
* | 重复零次或更多次(>=0) |
+ | 重复一次或更多次(>=1) |
? | 重复零次或一次(1,0) |
{n} | 重复n次(=n) |
{n,} | 重复n次或更多次(>=n) |
{n,m} | 重复n到m次(>=n,<=m) |
1.4. 字符类
[ ] 字符类
[0-9]代表0到9任意一个数字 如\d
[a-z0-9A-Z_]代表任意一个数字、大小写、下划线 如\w
1.5. 分枝条件
| 采用|把不同的规则分隔开,满足其中任意一种规则都当匹配
\d{2}|\d{8} 表示2位数或8位数均满足
\(?0\d{2}\)?[- ]?|0\d{2}[- ]? 表示()可以匹配,也可以不用,[- ]?表示满足一次或零次
1.6. 分组
采用小可以指定子表达式(分组),再用{n}指定需要重复次数
如 (\d{1,3}){3} 表示匹配1个1到3位数字,匹配可以重复3次
如 (\d{1,3}\.){3}(2[0-4]\d|25[0-5]) 表示1个1到3位数字加一个英文句号匹配重复3次,后面省略。
分组语法
分类 | 语法 | 说明 |
捕获 | (exp) | 匹配exp,并捕获文本自动命名组 |
(?<name>exp) | 匹配exp, 并捕获文本到名称为name的组里,同(?’name’exp) | |
(?:exp) | 匹配exp,不捕获匹配的文本,也不分配组号 | |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 | |
(?!exp) | 匹配后面跟的不是exp的位置 | |
(?<!exp) | 匹配前面不是exp的位置 | |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响。 |
1.7. 后向引用
使用小括号指定子表达式(分组),默认情况,每个分组均拥有一个组号。
后向引用用于重复搜索前面某分组匹配的文本。如 \1 代表分组1匹配文本 或采用\k<word>
\b(\w+)\b\s+\1\b 可以匹配重复单词,如go go
1.8. 贪婪与懒惰
贪婪匹配 匹配尽可能多的字符 如: a.*b
懒惰匹配 匹配尽可能少的字符 如: .*?
懒惰限定符
语法 | 说明 |
*? | 重复任意次,尽可能少重复 |
+? | 重复1次或更多次,尽可能少 |
?? | 重复0或1次,尽可能少 |
{n,m}? | 重复n到m次,尽可能少 |
{n,}? | 重复n次以上,尽可能少 |
1.9. 正则表达式选项
RegexOption成员 | 说明 |
None | 指定不设置任何选项 |
IgnoreCase | 指定不区分大小写的匹配 |
Multiline | 指定多行模式,更改 ^ $ 含义,匹配任何行开头和结尾 |
Compiled | 编译为程序集,启动时间代价,得到更快的执行速度。 |
Singleline | 单行模式。更改句点字符(.)含义,使它与每个字符匹配(除\n) |
IngorePatternWhitespace | 排除转义空白 |
RightToLeft | 从右向左搜索 |
1.10. 正则表达式编写方法
一般编写方式:
实例化后,采用Match进行校验
Regex regex= new Regex(expression, RegexOptions.Compiled);
match = regex.Match(input);
if (match.Success)
当然也可以采用静态方法校验,如:
Regex.IsMatch(strInput, @"^(\w+)@(\w+)\.(\w+)$");
Regex.IsMatch(strInput, @"^(\w+)@(\w+)\.(\w+)$",RegexOptions.Compiled);
分组内容输出:
Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",RegexOptions.Compiled);
r.Match(url).Result("${proto}${port}");
多行分组输出可以采用:
regex = new Regex(expression, regexOptions);
mc = regex.Matches(ms);
foreach (Match mt in mc)
{
String str= match.Groups["groupsName1"] + match.Groups["groupsName2"];
}