正则表达式 学习资料整理

常用正则表达式 整理篇
http://www.jb51.net/article/17355.htm

正则表达式高级学习技巧
http://www.jb51.net/article/9229.htm

1.正则表达式简介

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

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

其常用场合有如下三种:

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

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

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

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}

匹配前面的字符n至m次

?

匹配前面的字符0次或1次

+

匹配前面的字符至少1次

*

匹配前面的字符至少0次

2.4特殊控制类






|

指定字符替换,即该位置可以是|两边的任一个表达式

2.5 特殊字符转义序列


































































\\

匹配”\”

\.

匹配“.”

\*

匹配“*”

\(

匹配“(”

\)

匹配”)”

\?

匹配“?“

\+

匹配“+“

\|

匹配“|“

\{

匹配“{“

\}

匹配“}“

\^

匹配“^“

\$

匹配“$“

\n

匹配换行符

\r

匹配回车

\t

匹配Tab键

\v

匹配垂直制表符

\f

匹配换页符

\nnn

匹配一个三位八进制数指定的ASCII字符,如\103匹配C

\xnn

匹配一个二位16进制数指定的ASCII字符,例如\x43匹配C

\unnnn

匹配一个4位16进制数指定的Unicode字符

\cV

匹配一个控制字符,(如复制Ctrl+C)

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

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

²       分组

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

1.    捕获:()

例子:ABC1EDF2UU

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

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

如果用C#中的group,则为ABC,EDF。因为group搜集的是匹配组的内容。
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.    非回溯(?>)

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

如输入字符串:He  was 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-77A   2. –AA

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

2.8 正则表达式的选项

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


















N

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

I

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

X

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

M

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

S

指定单行模式

2.9正则表达式的规则

1.正则表达式会对输入字符传进行最快的匹配,它一次搜索一个字符,知道实现第一次匹配。

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

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

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

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

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

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





















*?

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

+?

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

??

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

{n}?

等同于{n}

{n, }?

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

{n,m}?

介于n和m之间,尽可能少地使用重复

作者:hanxing0的专栏

(0)

相关推荐

  • 正则表达式简介及在C++11中的简单使用教程

    正则表达式Regex(regular expression)是一种强大的描述字符序列的工具.在许多语言中都存在着正则表达式,C++11中也将正则表达式纳入了新标准的一部分,不仅如此,它还支持了6种不同的正则表达式的语法,分别是:ECMASCRIPT.basic.extended.awk.grep和egrep.其中ECMASCRIPT是默认的语法,具体使用哪种语法我们可以在构造正则表达式的时候指定. 正则表达式是一种文本模式.正则表达式是强大.便捷.高效的文本处理工具.正则表达式本身,加上如同一门

  • 常见的数字验证正则表达式整理

    验证数字的正则表达式集 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 验证非零的正整数:^\+?[1-9][0-9]*$ 验证非零的负整数:^\-[1-9][0-9]*$ 验证非负整数(正整数 + 0) ^\d

  • C语言正则表达式操作示例

    本文实例讲述了C语言正则表达式操作.分享给大家供大家参考,具体如下: #include <stdio.h> #include <sys/types.h> #include <regex.h> int main(int argc,char**argv) { int status; int i; int cflags = REG_EXTENDED; regmatch_t pmatch[1]; const size_t nmatch =1 ; regex_t reg; con

  • 正则表达式基本语法详解

    正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符").模式描述在搜索文本时要匹配的一个或多个字符串. 1.正则表达式基本语法 两个特殊的符号'^'和'$'.他们的作用是分别指出一个字符串的开始和结束.例子如下: "^The":表示所有以"The"开始的字符串("There","The cat"等): "of despair$":表示所以以&q

  • 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等

    一.校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9][0-9]*)$ 6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 7 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$ 8 正数.负数.和小数:^(\-|\+)?\d+(\.\d+)?$ 9 有两位小数的正实数:^[0-9]

  • 匹配yyyy-mm-dd日期格式的的正则表达式

    其实我也很头疼正则表达式,百度了一些资料,总结一下,这里留个备份吧. 要考虑的问题:合法的日期是多少:每个月的天数不一样:闰年的问题.... 1.合法的日期:MSDN上规定--在公元(基督纪元)0001 年 1 月 1 日午夜 12:00:00 到公元 (C.E.) 9999 年 12 月 31 日晚上 11:59:59 之间的日期和时间 查看http://msdn.microsoft.com/zh-cn/library/system.datetime(VS.80).aspx 2.闰年的概念:百

  • 正则表达式匹配不包含某些字符串的技巧

    经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^(hede)来过滤"hede"字串,但这种写法是错误的.我们可以这样写:[^hede],但这样的正则表达式完全是另外一个意思,它的意思是字符串里不能包含'h','e','d'三个但字符.那什么样的正则表达式能过滤出不包含完整"hello"字串的信息呢? 事实上,说正则表达式里不支持逆向匹配并不是百分之百的正确.就像这个问题,我们就可以使用否定式查找来模拟出逆向匹配,从而解决我们的问

  • 正则表达式(括号)、[中括号]、{大括号}的区别小结

    正则表达式的() [] {}有不同的意思. () 是为了提取匹配的字符串.表达式中有几个()就有几个相应的匹配字符串. (\s*)表示连续空格的字符串. []是定义匹配的字符范围.比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字.[\s*]表示空格或者*号. {}一般用来表示匹配的长度,比如 \s{3} 表示匹配三个空格,\s[1,3]表示匹配一到三个空格. (0-9) 匹配 '0-9′ 本身. [0-9]* 匹配数字(注意后面有 *,可以为空)[0-9]+ 匹配数字(注意后

  • 精通JS正则表达式(推荐)

    正则表达式可以: •测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证 •替换文本.可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字 •根据模式匹配从字符串中提取一个子字符串.可以用来在文本或输入字段中查找特定文字 正则表达式语法 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.该模式描述在查找文字主体时待匹配的一个或多个字符串

  • 匹配中文汉字的正则表达式介绍

    \w匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下 复制代码 代码如下: 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 或许你也需要匹配双字节字符,中文也是双字节的字符 复制代码 代码如下: 匹配双字节字符(包括汉字在内):[^\x00-\xff] 注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) PS:关于正则,本站还提供了2款非常简便实用的正则表达式工具供大家参考使用: JavaScript正则表达式在线测试工具: http:/

随机推荐