正则表达式入门(1)
示例用的是C#
VS 控制台引用程序
1.准备工作
(1) 先在项目根下创建目录examples统一存放示例文本文件
(2) 创建一个读取文本文件内容的方法,方便获取文件内容,代码如下
static string ReadFile(string name) { string path; //拼接文件路径 path = string.Concat( Environment.CurrentDirectory, "\\examples\\", name, ".txt" ); //返回文件内容,默认文件编码,和系统一致,就不再指定了 return File.ReadAllText(path); }
2.示例1
先在examples目录下创建第一个示例文本文件 example1.txt
为了要在生成的时候一起把文件复制过去,需要把文件的属性"复制到输出目录"选项改成"如果较新则复制",默认是"不复制"
在文件输入1-15的数字和a-f的字符,每行一个,内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
a
b
c
d
e
f
第一个示例方法,简单的匹配每行的数字,代码如下
static void example1() { string content; string expression;
Regex regex; MatchCollection matches; expression = "^[0-9]"; //读取文件内容 content = ReadFile("example1"); regex = new Regex(expression, RegexOptions.Multiline); //Matches找到所有匹配 matches = regex.Matches(content); //显示所有匹配文本的内容 foreach (Match match in matches) { Console.WriteLine(string.Concat("'", match.Value, "'")); } }
表达式比较简单,由"^"和"[0-9]"组成
"^" 不会匹配任何字符,表示的是任意一行的开始,表示行尾的是"$"
"[0-9]","["和"]"表示的是一个字符分组,中间的"0-9"表示的是0到9所组成的数字,当然还可以用"[0123456789]","0-9"中用"-"来表示一个范围,如果不想匹配数字"5",那可以用"[012346789]"或者简"[0-46-9]"
"^[0-9]"还有一个等效的表达式,"^\\d",因为字符串本身有转义,所以是2个"\",正则表达式本身是"^\d",\d表示一个十进制数字
这个表达式匹配的是放在任意一行第一个位置的数字,如果行的第一个字符不是数字,则不会匹配
有一点需要注意的是 RegexOptions 枚举,如果指定的是RegexOptions.Singleline,则会忽略所有换行,"^"只能匹配到字符串的头,下面的每行的开头都不会被匹配到。
本例需要的是匹配的是每一行,所以指定了RegexOptions.Multiline
执行后显示的结果是
'1' '2' '3' '4' '5' '6' '7' '8' '9' '1' '1' '1' '1' '1' '1'
因为只匹配了一个字符
如果想要1-15都匹配,可以这样
"^\\d*"或者"^\\d+"或者"^\\d{1,2}"
"^\\d*" 后面的 "*" 表示的是可以匹配0个或者多个,因为允许0个匹配,所以下面a-f所在的行也可以匹配到,只是匹配的到结果是空字符串
显示结果如下
'1' '2' '3' '4' '5' '6' '7' '8' '9' '10' '11' '12' '13' '14' '15' '' '' '' '' '' ''
好像不太符合要求
"^\\d+"就比较符合要求了,+表示1个或多个匹配,至少需要有1个匹配
结果如下
'1' '2' '3' '4' '5' '6' '7' '8' '9' '10' '11' '12' '13' '14' '15'
这样就对了
"*"和"+"都是属于量词(quantifiers),用来限制前面的元素所匹配的次数
"*" 表示 0个或多个(任意个)
"+" 表示 1个或多个(至少有1个)
"?" 表示 0个或1个(有或者没有)
当然还有这种形式
"^\\d{1,2}"
{1,2}表示的是一个区间(interval quantifier),也是用来限制匹配次数的 形式是 {min, max}
其中max必须大于等于min
区间比较灵活,比如上面的 忽略个位数(至少要有2次匹配) 可以写成"^\\d{2,}",100以下的可以这么写"^\\d{1,2}",
在min和max相同时可以只写一个,比如只要个位数,那只要写"^\\d{1}"
"{0,}"效果等同于"*"
"{1,}"效果等同于"+"
"{0,1}"效果等同于"?"
如果要限制只匹配纯数字的行,可以用"^\\d+$"
数字或者字母可以这样"^[\\dA-Za-z]+"