正则表达式必知必会(修订版)整理教程

正则表达式必知必会(修订版)整理教程

1.   正则表达式入门

1.1  用途:是一种工具,主要用途是搜索变化多端的文本。匹配       到我们想要的信息。

1.2  使用正则表达式:在线测试工具:http://tool.oschina.net/regex/

2.  匹配单个字符

2.1  匹配纯文本

例子:

文本

Hello,my name is zhaikaishun,please visitmy blog at http://blog.csdn.net/t1dmzks?viewmode=contents

正则表达式

Zhaikaishun

结果

Hello,my name is zhaikaishun,pleasevisit my blog at
http://blog.csdn.net/t1dmzks?viewmode=contents

正则表达式

my

结果

Hello,myname is zhaikaishun,please visit
my blog at http://blog.csdn.net/t1dmzks?viewmode=contents

2.1.1 多个匹配结果问题

大多数正则表达式引擎默认匹配第一个匹配,比如这个my,只匹配第一个,但是也有的匹配全部,如何将两个或两个以上的全部找出来呢,在js中使用g,其他的,请参照相关信息

2.1.2字母大小写问题

正则表达式是区分大小写的,Zhaikaishun不匹配zhaikaishun,不过绝大多数是不区分的,例如mysql,javascript不区分大小写,如何让区分大小写的也不区分,有相关的方法,具体问题具体分析,后面也有相关的例子,这里暂时不阐述

2.2  匹配任意字符

文本

Hust

Wust

Whu

Hust1

Whu1

Hust2.zks

Whu.tzgg

正则表达式

Hust

结果

Hust

Wust

Whu

Hust1

Whu1

Hust2.zks

Whu.tzgg

分析:

能将Hust+一个字符给匹配出来,一个 . 代表任何单个字符、字母、数字、甚至是本身,可以组合使用,例如

正则表达式

.u..

匹配结果

Hust

Wust

Whu

Hust1

Whu1

Hust2.zks

Whu.tzgg

分析:能匹配 u的前面一个字符+u+后面两个字符

2.3  匹配特殊字符

使用转义字符\

例如匹配 . 使用\.  ;匹配\ 使用 \\

2.

3.   匹配一组字符

3.1匹配多个字符中的某一个

使用[] 例如,匹配abc中的某一个字符,可以[abc]

例如 文本

Zhaikaishun like Eating ice creams,but Ican’t eat to much

正则表达式

[Ee]at

结果

Zhaikaishun like Eatingice creams,but I can’t
eat to much

分析: [Ee]匹配E或者e,at匹配at

3.2利用字符区间

例如:

[0123456789]可以写成[0-9]

常见合法区间


[A-Z]


匹配从A到Z的所有大写字母


[a-z]


匹配从a到z的所有小写字母


[A-z]


匹配所有从ASCII字符A到ASCII字符z,中间还包括一些其他的字符,例如],[,/,^等字符,不常用


[A-Za-z0-9]


匹配大写A-Z,小写a-z,数字0-9的任意一个

3.3 取非匹配

除了这个字符集合的字符,其他全部匹配

例如[^0-9]只要不是0-9的字符都可以匹配

4.   使用元字符

元字符是在正则表达式的特殊字符

对特殊字符进行转义的方法,使用\

这里先列出正则表达式所有元字符及其使用方法一览表,方便大家查阅,不理解的可以在看完整个整理即可了解

4.1正则表达式所有元字符及其使用方法一览表


字符


描述


\


将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,‘n‘
匹配字符 "n"。‘\n‘ 匹配一个换行符。序列 ‘\\‘ 匹配 "\" 而 "\(" 则匹配 "("。


^


匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n‘ 或 ‘\r‘ 之后的位置。


$


匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n‘ 或 ‘\r‘ 之前的位置。


*


匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。


+


匹配前面的子表达式一次或多次。例如,‘zo+‘ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。


?


匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。


{n}


n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}‘ 不能匹配 "Bob" 中的 ‘o‘,但是能匹配 "food" 中的两个 o。


{n,}


n 是一个非负整数。至少匹配n 次。例如,‘o{2,}‘ 不能匹配 "Bob" 中的 ‘o‘,但能匹配 "foooood" 中的所有 o。‘o{1,}‘ 等价于 ‘o+‘。‘o{0,}‘ 则等价于 ‘o*‘。


{n,m}


m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, "o{1,3}" 将匹配 "fooooood" 中的前三个 o。‘o{0,1}‘
等价于 ‘o?‘。请注意在逗号和两个数之间不能有空格。


?


当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m})
后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",‘o+?‘ 将匹配单个 "o",而 ‘o+‘ 将匹配所有 ‘o‘。


.


匹配除 "\n" 之外的任何单个字符。要匹配包括 ‘\n‘ 在内的任何字符,请使用象 ‘[.\n]‘ 的模式。


(pattern)


匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中则使用 $0$9 属性。要匹配圆括号字符,请使用 ‘\(‘ 或 ‘\)‘。


(?:pattern)


匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries‘ 更简略的表达式。


(?=pattern)


正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, ‘Windows (?=95|98|NT|2000)‘ 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。


(?!pattern)


负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如‘Windows (?!95|98|NT|2000)‘ 能匹配 "Windows 3.1"
中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始


x|y


匹配 x 或 y。例如,‘z|food‘ 能匹配 "z" 或 "food"。‘(z|f)ood‘ 则匹配 "zood" 或 "food"。


[xyz]


字符集合。匹配所包含的任意一个字符。例如, ‘[abc]‘
可以匹配 "plain" 中的 ‘a‘。


[^xyz]


负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]‘
可以匹配 "plain" 中的‘p‘。


[a-z]


字符范围。匹配指定范围内的任意字符。例如,‘[a-z]‘ 可以匹配 ‘a‘ 到 ‘z‘ 范围内的任意小写字母字符。


[^a-z]


负值字符范围。匹配任何不在指定范围内的任意字符。例如,‘[^a-z]‘
可以匹配任何不在 ‘a‘ 到 ‘z‘ 范围内的任意字符。


\b


匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b‘
可以匹配"never" 中的 ‘er‘,但不能匹配 "verb" 中的 ‘er‘。


\B


匹配非单词边界。‘er\B‘ 能匹配 "verb" 中的 ‘er‘,但不能匹配 "never" 中的 ‘er‘。


\cx


匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c‘ 字符。


\d


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


\D


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


\f


匹配一个换页符。等价于 \x0c 和 \cL。


\n


匹配一个换行符。等价于 \x0a 和 \cJ。


\r


匹配一个回车符。等价于 \x0d 和 \cM。


\s


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


\S


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


\t


匹配一个制表符。等价于 \x09 和 \cI。


\v


匹配一个垂直制表符。等价于 \x0b 和 \cK。


\w


匹配包括下划线的任何单词字符。等价于‘[A-Za-z0-9_]‘。


\W


匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]‘。


\xn


匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, ‘\x41‘ 匹配 "A"。‘\x041‘ 则等价于 ‘\x04‘ & "1"。正则表达式中可以使用 ASCII 编码。.


\num


匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,‘(.)\1‘ 匹配两个连续的相同字符。


\n


标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。


\nm


标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 的后向引用。如果前面的条件都不满足,若  n 和 m 均为八进制数字
(0-7),则 \nm 将匹配八进制转义值 nm


\nml


如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。


\un


匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

5.  重复匹配

5.1有多少个匹配

文本 Hello,MyEmail is [email protected] ,xiaoming’sEmail is asdw.gmail.magic.com

5.1.1匹配一个或多个字符

使用+,例如为了匹配上述的电子邮箱

正则表达式

\w+@\w+\.\w+

结果

hello,my email is [email protected], ,xiaoming’s Email is .sdw.gmail.magic.com

分析:\w可以匹配所有的字母和数字(以及下划线_。这个字符在电子邮件中是合法的),第一个\w+匹配多个字母或数字字符,然后接一个@(@不需要转义),第二个\w+匹配多个字母或数字字符,\.匹配一个.(.需要转义,这里才用的\.)第三个\w+匹配多个字母或数字字符.

但是这里我们漏掉了asdw.gmail.magic.com,加入要这两个都匹配出来,可以使用[\w.]+@[\w.]+\.\w+

5.1.2匹配0个或多个字符

使用*即可。和+类似,但是+至少匹配一次,*可以一次也不匹配

5.1.3匹配0个或一个字符

使用元字符?

5.2匹配的重复次数

正则表达式的+、*、?解决了很多问题,但是有时候,我们需要精确到某一个次数,正则表达式提供了一个设置次数的语法

5.2.1匹配一个精确的值

{num}匹配num次,例如

文本 1231234 12345 abcde abcedf

正则表达式:\w{5}

结果:123 1234 12345
abcde abce5f

5.2.2为重复匹配设定一个区间

{num1,num2}匹配num1次到num2次之间,例如

文本:aa11aa,aa1aa,bb111bb,bb1111aa

正则表达式:[0-9]{2,4}

结果:aa11aa,aa1aa,bb111bb,bb1111aa

5.2.3匹配至少重复多少次

{num,}例如:

文本:  123 1234 12345 abcde,abcedfabcdefghijk

正则表达式: \w{4,}

结果: 123 1234
12345 abcde abcedf,abcedfabcdefghijk

5.3防止匹配过渡

?只能匹配一个字符,{n}和{m,n}也有一个重复次数的上限但是对于其他的,例如+、*等没有一个上限,有时候就会导致过渡匹配的情况,例如下面这个例子

文本: Learn English is important,but in <b>CH</b>AND<b>JP<b>,the teachingis not available.

正则表达式:<[Bb]>.* </[Bb]>

结果: Learn English is important,but in
<b>CH</b>AND<b>JP<b>,theteaching is not available.

分析:显然,这个.*把第第二个</b>和第三个<b>都给一网打尽,虽然没有漏掉我们所需要的文本,但是,这两个b却莫名失踪了,还多匹配了一个and

为什么会这样呢,是因为*和+都是“贪婪型”元字符,他们在进行匹配时是多多益善的而不是适可而止的。

解决办法:使用这些元字符的“懒惰型”版本,使其匹配尽可能的少,

常见的贪婪型元字符和他们的懒惰型版本


贪婪型元字符


懒惰型元字符


*


*?


+


+?


{n,}


{n,}?

比如刚才那个例子

正则表达式:<[Bb]>.*?</[Bb]>

结果:LearnEnglish is  important,but in
<b>CH</b>AND<b>JP<b>,theteaching is not available.

6.匹配位置

6.1单词边界:

限定符\b指定单词边界,b是英文boundary(边界)的首字母,例如

文本:The catscattered his food all over the room.

正则表达式:cat

结果: The cat scatteredhis food all over the room.

正则表达式:\bcat\b

结果: The cat scattered his food all overthe room.

如果想不匹配一个单词的边界(),使用\B ,例如下面的例子匹配多余的空格

文本: please enter the nine-digit id as it appears on your color – cpdedpass-key

正则表达式:\B-\B

结果:please enter the nine-digit id as it appears on your color
– cpded pass-key

分析:\B-\B

将匹配一个前后都不是单词边界的连字符(因为空格和连字符都不是字母数字或下划线)。只有color – cpded中的连字符可以与之匹配

6.2字符串边界

6.2.1匹配字符串开头

在第三章节中,我们知道使用^可以用来取非,其实他还有匹配一个字符串的开头

当^出现在一个字符集合中(被放到[和]之间)并且紧跟在左方括号[的后面是,才能发挥“求非”作用。如果是在一个字符集合的外面并且位于一个模式的开头,^将匹配字符串的开头。例如,下面的测试可以检查一个文档是否为xml文档(xml文档必须是<?xmlversion="1.0"?>类型,而且必须放在开头)

文本: this is not a xml document, real not a xmldocument

<?xmlversion="1.0"ecoding=”utf-8” ?>

<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML1.1//EN" " >

<wml>

<head>

<access/>

正则表达式:<\?xml.*\?>

结果:this is not a xml document, real not a xmldocument

<?xmlversion="1.0"ecoding=”utf-8” ?>

<!DOCTYPEwml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" " >

<wml>

<head>

<access/>

我们就以为这是xml文件了,其实这不是xml文件,xml文件必须是在开头有上述标示才行

正确的正则表达式:^\s*<\?xml.*?\?>

6.2.2匹配字符串结尾

使用$即可

6.2.3分行匹配

(?m)说明是分行模式,必须出现在整个模式的最前面,下例将会找出所有的注释文章

文本:

String author()default "aaa";

//aaaaaaa

int[]arrayAttr() default {1};

//bbbbbbbb

MetaAnnotation annotationAttr() [email protected]("");

//ccccccc

Class<PersonChiness> classType()default PersonChiness.class;

正则表达式:(?m)^\s*//.*$

结果:Stringauthor() default "aaa";

//aaaaaaa

int[]arrayAttr() default {1};

//bbbbbbbb

MetaAnnotation annotationAttr() [email protected]("");

//ccccccc

Class<PersonChiness> classType()default PersonChiness.class;

警告:有许多正则表达式不支持(?m)

7.使用子表达式

7.1子表达式

子表达式是一个更大的表达式的一部分,把一个表达式分解成一系列子表达式的目的就是为了把那些子表达式当做一个独立元素来使用。子表达式必须用()括起来

例如 &nbsp;{2,}只能匹配&nbsp;;;;这样的文本

只有(&nbsp;)(2,)才能匹配&nbsp; &nbsp; &nbsp; &nbsp;这样的文本(&nbsp;)是一个子表达式,它将被视为一个独立元素,而紧跟在它后面的{2,}将作用于这个子表达式

例如我们想要匹配一个年份,|是或的意思

文本 1949-05-10

正则表达式19|20\d{2}

结果:1949-05-10

因为上述表达式

匹配19或者20后面再加连个数字,自然就匹配到了19

正则表达式

(19|20)d{2}

结果1949-05-10

7.2子表达式的嵌套

子表达式允许嵌套,这样可以构造出功能强大的正则表达式来,但是这种嵌套最好遵循适可而止的原则,不然太复杂也看不懂.

如果我们要匹配一个合法的IP地址,首先我们得把规则列举出来

类似于255.255.255.255

这里有4个模块。对于每一个模块,有以下几个规则

l  任何一个1位或者2位的数字

l  任何一个以1开头的3为数字

l  任何一个以2开头,第二位在0-4之间的三位数字

l  任何一个以25开头,第三位在0-5的三位数字

正则表达式:

(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))

时间: 2024-07-29 03:59:32

正则表达式必知必会(修订版)整理教程的相关文章

Nginx系列教程之三:nginx 必知必会

书接上回,聊一聊nginx的必知必会!!! 前言:从该教程往后,涉及到nginx的功能将越来越生产化,因此某些测试必须是基于web架构平台,所以在看本教程之前,建议先安装好LNMP或者LAMP架构,以便测试验证.其次该技术文档的测试是基于前端nginx反向代理与后端LNMP架构来测试的,后端LNMP主要是提供测试的访问页面而已,重点还是前端Nginx的设置 测试环境:前端代理:OS:CentOS6.5x64hostname:test1.lxm.comip:10.0.10.11 后端LNMP:OS

正则表达式必知必会小总结

<正则表达式必知必会>这本书的确非常的简练实用,准确定位了正则表达式的用途,简明的介绍了正则表达式的基本使用形式.简单易懂,容易记忆,虽然从表面上看这本书的内容比较少而且简单,但是说的内容都是非常基础的砖石,无论想建造多么高大.吊炸天的大楼,基础的砖石都是必不可少的. 看完这本书,受益颇多,在此将书中的内容再次总结,搭起自己对于正则表达式的认识框架. 正则表达式的使用对象:文本/字符串.用途对文本/字符串进行搜索.替换. 正则表达式的基本匹配单位:一个字符. 正则表达式在不同的程序设计语言中,

《MySQL必知必会学习笔记》:正则表达式

正则表达式的应用 前面的几节的过滤例子允许用匹配.比较和通配操作符来寻找数据.对于基本的数据过滤,这样就足够了.但是随着过滤条件的复杂性的增加,where子句本身的复杂性也有必要增加.这也就是正则表达式变得有用的地方. 正则表达式是用来匹配文本中特殊的字符集合. 正则表达式不是自己第一次见,在JAVA/C++ 这些语言中,都有正则表达式,不过他们的用途是一样的,都是匹配文本中的字符串.可能具体的用法不太一样,但也差不多.下面将一一进行学习.介绍. 基本字符的匹配 当我们想查找某列中的字符中是否有

《SQL必知必会(第4版)》中英文PDF及代码+《SQL进阶教程》中文PDF及代码 (学习总结)

下载:https://pan.baidu.com/s/1hRb-TS_R-0fnXPodS5OoDg <SQL必知必会(第4版)>高清中文PDF+高清英文PDF+代码 下载:https://pan.baidu.com/s/11-MnDu0khzwO4tiJqHznnA <SQL进阶教程>高清中文PDF+源代码 <SQL必知必会(第4版)>高清中文PDF+高清英文PDF+代码 高清中文PDF,258页,带书签目录,文字可以复制粘贴:高清英文PDF,497页,带书签目录,文

《mysql必知必会》笔记-部分

<mysql必知必会>笔记-部分 注释: 开始时整理笔记,记录自己看书过程的疑问和重点,后来发现记录没太多意义,还不如直接去翻原书,所以就放弃了. 因此,这个笔记只有一部分,不过依旧分享出来. 1.语言分类: 客户机可以是MySQL提供的工具.脚本语言(如perl).Web应用开发语言(如ASP.ColdFusion.JSP和PHP).程序设计语言(如C.C+kJava)等. 2.之前找不到表的原因: 虽然SQL是不区分大小写的,但有些标识符(如数据库名.表名.列名)可能不同:在MySQL4.

mysql 必知必会总结

以前 mysql 用的不是很多, 2 天看了一遍 mysql 必知必会又复习了一下基础.  200 页的书,很快就能看完, 大部分知识比较基础, 但还是了解了一些以前不知道的知识点.自己做一个备份,随时查看. 命令:sql 不区分大小写,语句大写,列.表名小写是一种习惯连接命令:mysql -u user_name –h example.mysql.alibabalabs.com –P3306 –pxxxxquithelp show; // 查看所有 show 命令show databases;

移动前端开发人员必知必会:移动设备概述

因为工作岗位的变换带来工作内容的变动,对于移动网站的前端开发已经疏远了好几个月,在这好几个月中有很多新的东西出现,自己所掌握的一些东西也已经陈旧,所以选择了这本书<HTML5触摸界面设计与开发>来系统地学习和整理一下关于移动网站前端开发的知识体系. 之所以选择这本书,一是因为这本书比较新,2014年04月发的第一版.其二是因为作者Stephen Woods,这是Flickr团队的资深前端,Yahoo主页的Javascript技术平台正是出自此人之手. 接下来的时间里会陆续上传关于这本书学习的一

《MySQL 必知必会》读书总结

这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. ? ? 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter password:****** 显示数据库 mysql>SHOW DATABASES; 选择数据库 mysql>USE mytest; 显示数据库中的表 mysql>SHOW TABLES; 显示表列 mysql>SHOW COLUMNS FROM tmall_user; mysql

师傅叮嘱要下山的徒弟必知必做的江湖规矩!

时间过的很快一晃又一个班毕业了.看到大家一个个找到了满意的工作,老男孩老师也是感觉很有成就啊,为了让大家再工作中发展的更好,给大家整理了10篇博文 1.linux运维高薪就业指导(0基础新手获得10K+高薪必备) http://oldboy.blog.51cto.com/2561410/1655600 老男孩超级强的就业指导课程,使得0基础运维班平均工资达到了12K. 2.初入运维职场菜鸟必知必做的工作心态! http://oldboy.blog.51cto.com/2561410/141451