专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » 正则表达式学习:正则表达式 学习资料整理 »正文

正则表达式学习:正则表达式 学习资料整理

来源: 发布时间:星期一, 2009年9月7日 浏览:9次 评论:0
1.正则表达式介绍

正则表达式(Regular expression,简写为Regexes)是种用来操作和检验串数据强大工具它相当和串特殊用它可以转换成算法对文本进行匹配等操作

事实上正则表达式有其自身套语法这种语法对于初学者来说显得有些晦涩难懂尤其是其构造比较困难称为很多入门者障碍但当掌握后却可以轻易解决以前不容易解决很多文本类问题如验证提取等

其常用场合有如下 3种:

Ø测试某个模式例如可以对个输入串进行测试看在该串是否存在个电话号码模式或个信用卡号码模式这称为数据有效性验证

Ø替换文本可以在文档中使用个正则表达式来标识特定文字然后可以全部将其删除或者替换为别文字

Ø根据模式匹配从串中提取个子可以用来在文本或输入字段中查找特定文字

2.正则表达式基础语法

2.1匹配区别类型





匹配


\d

匹配个数字等价于 [0-9]


\D

匹配个非数字等价于 [^0-9]


\w

匹配包括下划线任何单词等价于'[A-Za-z0-9_]'


\W

匹配任何非单词等价于 '[^A-Za-z0-9_]'


\s

匹配任何空白包括空格、制表符、换页符等等等价于 [ \f\n\r\t\v]


\S

匹配任何非空白等价于 [^ \f\n\r\t\v]


.(点号)




[...]

括号中


[^…]

非括号中





2.2定位控制

^

其后模式必须在开始处如果是多行则在任开始C#需要设定Multiline标志


$

前面模式必须在末尾如果是多行则在任意行末尾


\A

前面模式必须在开始处;多行标志被忽略


\z

前面模式必须在末尾处多行标志被忽略


\Z

前面模式必须位于末尾或位于换行符前


\b

匹配个单词开始单词[a-zA-Z0-9]


\B

匹配个非单词边界位置 不在个单词开始





2.3指定重复

{n}

匹配前面n


{n,}

匹配前面最少n


{n,m}

匹配前面nm


?

匹配前面0次或1


+

匹配前面至少1


*

匹配前面至少0





2.4特殊控制类

|

指定替换即该位置可以是|两边个表达式





2.5 特殊转义序列

\\

匹配”\”


\.

匹配“.


\*

匹配“*


\(

匹配“(”


\)

匹配”)”


\?

匹配“?“


\+

匹配“+


\|

匹配“|


\{

匹配“{


\}

匹配“}


\^

匹配“^


\$

匹配“$


\n

匹配换行符


\r

匹配回车


\t

匹配Tab


\v

匹配垂直制表符


\f

匹配换页符


\nnn

匹配个 3位 8进制数指定ASCII\103匹配C


\xnn

匹配个 2位16进制数指定ASCII,例如\x43匹配C


\unnnn

匹配416进制数指定Unicode


\cV

匹配个控制(如复制Ctrl+C)





2.6正则表达式分组、替换、反向引用等高级应用

以上只是正则表达式基础部分从这里开始才算真正开始正则表达式的旅

²分组

分组技术可以匹配在个组中所有用()来表示是下面两个技术基础所在“()“又称捕获符号

1.捕获:()

例子:ABC1EDF2UU

匹配组表达式:([A-Z]{3})\d--匹配3个连续大写字母和个数字

匹配结果:1.ABC1,2.EDF2

如果用C#group则为ABC,EDFgroup搜集是匹配组内容
2.
非捕获(?:)


使用了非捕获就介绍说明该()中内容将不作为捕获组返回而和其它表达式共同构成匹配项返回也就是捕获组将不存在

例:1AF3EDC

匹配表达式:(?:\d|[A-Z])\w--匹配个数字或字母加个任意

匹配结果:1.1A 2.F3 3.ED

没有组被捕获

2.通过名称捕获(?<name>)

定义了名称捕获组可以在反向匹配中运用名称进行反向引用而不需要再使用数字进行反向捕获注意组名区分大小写!

²替换

替换顾名思义是将匹配替换成其他指定形式这个功能是在分组基础上(当然或许可以单独存在但是那样匹配功能显然不够强大)在这里有个窍门技巧是使用附加匹配控制匹配内容

$group

group指定组号进行替换


${name}

替换由<?name>匹配最后个子串


$$

替换$


$&

替换整个匹配


$+

替换最后捕获


$

替换整个输入







²反向引用

反向匹配可以引用前面组中匹配形式\匹配组数字表示(1为基数)“或者”\k<groupname>

²高级组

1.正声明(?=)

规定了括号中模式必须出现在声明右侧模式将不构成匹配部分

2.负声明(?!)

规定了括号中模式不能出现在声明右侧模式将不构成匹配部分

3.反向正声明(?<=)

规定了括号中模式必须出现在声明左侧模式将不构成匹配部分

4.反向负声明(?<!)

规定了括号中模式必须出现在声明左侧模式不构成匹配部分

5.非回溯(?>)

防止了正则表达式引擎搜索失败时回溯这称的为贪婪子表达式

如输入串:Hewas very trusting.

正则表达式:.*ing将匹配trusting但是如果加入(?>)ing则不能完成匹配

非回溯组也是非捕获组他对于提高正则表达式效率很有效

如匹配www.****.com网址使用www\.(.*)\.com显然要比www\.([^.]*)\.com效率要低前者必须使用组中回溯操作回溯是很艰难过程所以当使用非回溯正则表达式时时可以显著提高正则表达式效率

其实正则表达式是只注重匹配结果所以会努力去匹配所存在这就是它贪婪性所在(这点其实理解不是太深)

注意以上这些(1-5)都不能够用于反向引用以上声明将不作为匹配部分

2.7在正则表达式中做决策

高级决策两种写法:

1=>(?(expression)yes|no)

2=>(?(?=expression)yes|no)

这两种方式中expression匹配则后面进行匹配yes否则匹配no

需要注意点是yes测试和决策测试是在同个起点里进行

如以下串:77-77A 69-AA 57-B

匹配表达式为:(\d7)?-(?(1)\d\d[A-Z]|[A-Z][A-Z])

匹配结果为:

1.77-77A2. –AA

这个正则表达式中用到了引用组(?(1)**)中1也可以换为\1,这样不影响匹配这个匹配中如果将决策后面\d\d去掉则会出现区别结果这时只会有-AA是匹配决策点和yes表达式是从同个起点开始匹配所以即使决策点匹配了但是后面yes表达式仍然不匹配就只匹配no部分表达式最终结果也必然改变理解这点很重要

2.8 正则表达式选项

快到结尾了再说下正则表达式选项选项其实就是将正则表达式设置改到组中来如(?i:[a-z])将忽略大小写进行匹配实际上如果学过Javascript正则表达式可以看出这个ijavascript中表示还是这个意思

N

规定只有显示命名组标号组才能有效捕获


I

此选项匹配不区分大小写匹配


X

此选项规定非转义被排除在模式的外并启用了个前缀#注释


M

指定多行模式修改了^$定义


S

指定单行模式





2.9正则表达式规则

1.正则表达式会对输入传进行最快匹配次搜索知道实现第次匹配

2.发现个匹配开始后正则表达式引擎将继续匹配直到遇到个不被模式接收

3.Regex引擎非常贪婪只要模式匹配它将匹配尽可能多

4.Regex渴望实现匹配所以将在需要时回溯以实现匹配

5.Regex引擎总是先选择第个选项|式表达式中

以上几点很重要到这正则表达式几乎所有规则也就讲完了

最后附个懒惰匹配常用修饰和其他限定

*

尽可能少地使用重复个匹配


+

尽可能少地使用重复但至少使用


??

使用零次重复(如有可能)或次重复


{n}

等同于{n}


{n, }?

尽可能少地使用重复但至少使用n


{n,m}?

介于nm的间尽可能少地使用重复





作者:hanxing0专栏
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: