C#.Net正则表达式学习笔记
在处理字符串时,你会经常有查找符合特定条件的字符串的需求,比如判断一串电话号码是否符合格式、一个邮箱是否符合格式、一个密码是否包含了字母大小写等等。
正则表达式(Regular expressions)用于匹配文本,使用一些定义好的匹配元字符,即“规则字符”,然后以它的逻辑去过滤筛选字符串。
需注意,不同环境下的正则表达式规则略有区别,这里的正则表达式是在微软C#下的。
C#正则表达式主要使用Regex类,你可以先做一些初步了解。
先看这么一个例子:
using System;
using System.Text.RegularExpressions;
class MyProgram
{
static void Main(string []args)
{
string numlist = "333,33,22,65,33";
string Regular_expressions = @"\b33\b";
foreach (Match i in Regex.Matches(numlist, Regular_expressions))
Console.WriteLine(i);
}
}
整个程序的功能是找出所有为33的字符串并输出。
这里的正则表达式是\b33\b。这是一个非常简单的功能,实际上正则表达式的能力远不止如此,你可以编写出很复杂的式子以完成你想要的功能。
最终的输出是:
33
33
正好有两个33。具体是如何实现的?我们将在下一节中解释部分正则表达式的元字符。
假设此时我们正在阅读一本英文书,我们希望找到其中所有的in,该怎么做?
这应该是最简单的正则表达式了,直接使用in即可。
事实却不行,因为很多单词都包含了in这两个字符,如inside,include等等,如果这样找的话,这里面的in也会被匹配。
正确的做法应该是\bin\b。
\b,即是正则表达式中规定的一个元字符(metacharacter),代表着一个单词的开头或结尾。两个单词可能会被空格和逗号分隔,但它不匹配这些,它只代表一个位置。
这样,你就可以匹配到一个独立的in。
现在更新一下情景:你仍然在阅读一本英文书,这次你想要找到所有以i开头的单词。怎么做?
答案是\bi\w*\b。
这个正则表达式略微复杂,但也不算难理解。
开头和结尾的两个\b匹配单词边缘,然后是开头字母i,接下来是\w,它可以匹配任意的字母、数字、下划线或者汉字。
后面的*号也是元字符,但它指代数量,在它前面的元字符可以出现任意次以完成匹配。
翻译一下,它的实际含义是先匹配一个字母i,然后经过任意个字符,匹配直到单词结束。
可以理解吧?好,现在情景又被更新了:你要在一群数字中找到一串格式正确的电话号码。
首先你要明白电话号码的格式,很简单,足够11位即可。
答案是:\d\d\d\d\d\d\d\d\d\d\d。
非常简单粗暴,\d也是元字符,匹配一个数字,写满11个即可。
但这样写未免太麻烦,所以这样写也是正确的:\d{11}。这里的11意为前面的元字符必须被匹配11次。
那么,如果你希望匹配到的电话号码要在正确的位置空格,如167 2829 0220,而不是16728290220(这个号码是我瞎编的),该怎么做?
很简单:\d{3}\s\d{4}\s\d{4}。
这里的\s匹配空白,组合起来即可匹配带空格的电话号码。
随着深入学习,你会发现正则表达式会越来越难以理解,越来越复杂。为了避免这个问题 ,你可以在浏览器上寻找一些相关辅助工具,这里不做细述。
字符 | 描述 |
---|---|
\ | 转义字符,将一个具有特殊功能的字符转义为一个普通字符,或反过来 |
(pattern) | 匹配 pattern 并获取这一匹配 |
(?:pattern) | 匹配 pattern 但不获取匹配结果 |
(?=pattern) | 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串 |
(?!pattern) | 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串 |
x | y |
[xyz] | 字符集合。匹配所包含的任意一个字符。例如,‘[abc]’可以匹配“plain”中的‘a’ |
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如,‘[^abc]’可以匹配“plain”中的‘p’ |
[a-z] | 匹配指定范围内的任意字符。例如,‘[a-z]’可以匹配’a’到’z’范围内的任意小写字母字符 |
[^a-z] | 匹配不在指定范围内的任意字符。例如,‘[^a-z]’可以匹配不在‘a’~‘z’'内的任意字符 |
\B | 匹配非单词边界 |
\D | 匹配一个非数字字符,等价于 [^0-9] |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\S | 匹配任何非空白字符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK |
\W | 匹配任何非单词字符。等价于‘[^A-Za-z0-9_]’ |