正则表达式 学习手记 111221

之前项目里面一直使用正则表达式,然而对于正则的语法只有基本的了解,这二天采点时间学习一下基本知识

 

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}

重复nm次(>=n,<=m

1.4.     字符类

[ ] 字符类

[0-9]代表09任意一个数字 \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} 表示匹配113位数字,匹配可以重复3

(\d{1,3}\.){3}(2[0-4]\d|25[0-5]) 表示113位数字加一个英文句号匹配重复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次或更多次,尽可能少

??

重复01次,尽可能少

{n,m}?

重复nm次,尽可能少

{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"];

 }


posted @ 2011-12-22 11:48  Nopcn  阅读(548)  评论(0编辑  收藏  举报