正则表达式入门(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]+"

 

 

posted on 2014-01-18 01:31  viago  阅读(415)  评论(3编辑  收藏  举报