正则表达式入门

合集下载

菜鸟正则表达

菜鸟正则表达

菜鸟正则表达正则表达式是一种用于匹配文本的模式。

它是一种强大的工具,可以用于搜索、替换和验证文本。

但是,对于初学者来说,正则表达式可能会让人感到困惑和不知所措。

因此,本文将介绍一些菜鸟正则表达式的基础知识,帮助初学者更好地理解和使用正则表达式。

1.基础语法正则表达式由字符和特殊字符组成。

字符可以是字母、数字或其他字符,而特殊字符则具有特殊的含义。

例如,正则表达式中的“.”表示任何字符,“\d”表示任何数字,“\w”表示任何字母、数字或下划线,“\s”表示任何空格字符。

2.匹配模式正则表达式可以使用不同的匹配模式来匹配文本。

最常用的匹配模式是“贪婪模式”,它会尽可能多地匹配文本。

例如,正则表达式“a.*b”将匹配任何以“a”开头、以“b”结尾的文本。

但是,如果文本中存在多个“a”和“b”,则该正则表达式将匹配最长的文本。

如果想要匹配最短的文本,可以使用“非贪婪模式”。

例如,正则表达式“a.*?b”将匹配最短的以“a”开头、以“b”结尾的文本。

3.字符集正则表达式中的字符集用于匹配一组字符中的任何一个字符。

例如,正则表达式“[abc]”将匹配任何一个字符“a”、“b”或“c”。

字符集还可以使用“-”表示范围。

例如,正则表达式“[a-z]”将匹配任何一个小写字母。

4.分组正则表达式中的分组用于将多个字符组合在一起,并对其进行操作。

例如,正则表达式“(ab)+”将匹配一个或多个“ab”字符串。

分组还可以使用“|”表示“或”。

例如,正则表达式“(a|b)”将匹配字符“a”或“b”。

5.转义字符正则表达式中的转义字符用于将特殊字符转义为普通字符。

例如,正则表达式“\.”将匹配字符“.”而不是任何字符。

转义字符还可以用于匹配特殊字符。

例如,正则表达式“\d”将匹配任何数字。

正则表达式是一种非常强大的工具,可以用于搜索、替换和验证文本。

虽然初学者可能会感到困惑和不知所措,但只要掌握了基础知识,就可以轻松地使用正则表达式。

C#正则表达式基础知识(经典归纳简单易懂)

C#正则表达式基础知识(经典归纳简单易懂)

正则表达式基础知识目录前言 (4)System.Text.RegularExpressions命名空间 (4)Regex类 (5)RegexOption枚举 (5)构造函数 (5)IsMatch()方法 (6)Match()方法 (6)使用Match对象 (6)MatchObj.Success (6)MatchObj.Value (7)MatchObj.ToString() (7)MatchObj.Length (7)MatchObj.Index (7)MatchObj.Groups (7)使用Group对象 (7)GroupObj.Success (7)GroupObj.Value (8)GroupObj.ToString() (8)GroupObj.Length (8)GroupObj.Index (8)GroupObj.Captures (8)MatchObj.NextMatch() (8)MatchObj.Result (string) (8)特殊的Replacement字符串 (9)MatchObj.Synchronized() (9)MatchObj.Captures (9)Matchs()方法 (10)Replace()方法 (10)Split()方法 (11)正则表达式缓存 (11)辅助函数 (12)Regex.Escape(string) (12)Regex.Unescape(string) (12)Regex.Empty (12)pileToA ssembly(...).. (12)基本语法 (13)字符匹配语法 (13)重复匹配语法 (13)字符定位语法 (14)转义匹配语法 (14)其它匹配语法 (15)语法示例 (16)(1)“@”符号 (16)(2)基本的语法字符 (16)(3)定位字符 (17)(4)重复描述字符 (19)(5)择一匹配 (20)(6)特殊字符的匹配 (21)(7)组与非捕获组 (21)(8)贪婪与非贪婪 (23)(9)回溯与非回溯 (24)(10)正向预搜索、反向预搜索 (24)(11)十六进制字符范围 (26)(12)对[0,100]的比较完备的匹配 (26)(13)精确匹配有时候是困难的 (27)前言正则表达式(Regular Expression)是强大、便捷、高效的文本处理工具。

正则表达式基础语法

正则表达式基础语法

正则表达式基础语法正则表达式是一种用于字符匹配的工具,它可以方便地对输入的文本进行筛选、提取或替换。

正则表达式的基础语法包括了一些常用的符号和表达式,下面就来一步步学习。

1. 字符匹配在正则表达式中,普通的字符表示对应的字符,比如"a"表示匹配字符"a","123"表示匹配数字串"123"。

这种模式匹配在实际应用中较少使用。

2. 元字符元字符是正则表达式中特殊含义的字符,它们在匹配时不表示原本的含义,而是表示一种特殊的匹配方式。

常用的元字符包括:.、^、$、*、+、?、\、|、[]、()、{}等。

3. 点字符(.)点字符表示任意一个字符,比如".at"可以匹配"cat","bat"等。

需要注意的是,点字符不能匹配换行符。

4. 开始符(^)和结束符($)开始符^表示匹配行首,用在正则表达式的开头,如"^abc"可以匹配"abc"开头的字符串;结束符$表示匹配行尾,用在正则表达式的末尾,如"def$"可以匹配"def"结尾的字符串。

5. 重复符(*, +, ?)重复符表示某个字符或表达式重复出现的次数,*表示重复0或多次,+表示重复1或多次,?表示重复0或1次。

如"ba*t"可以匹配"bt","bat","baat"等。

6. 转义符(\)转义符用于转义元字符,比如"\\."可以匹配"."字符本身,"\\\\d"可以匹配"\d"的字符串。

7. 或(||)或符号可以匹配多个表达式中的任意一个,如"cat|dog"可以匹配"cat"或"dog"。

正则表达式完全学习手册

正则表达式完全学习手册

正则表达式完全学习手册:菜鸟入门指导正则表达式能够很恐怖,真得很恐怖。

幸运的是,一旦记住每一个符号所表达的意思,恐惧就会快速消退。

若是你对正则表达式一无所知,正如文章题目,那你又就有很多东西要学了。

下面让咱们马上开始吧。

第一节:基础学习想要高效地学习和掌握正则表达式的关键是花一天的时刻记居处有符号。

这可能是我所能提供的最好的建议。

坐下来,做些记忆卡片,然跋文住它们。

以下为最多见的一些符号:. - 匹配任意字符,换行符除外(如果dotall 为false)。

* - 该符号前面的字符,匹配0 次或多次。

+ - 该符号前面的字符,匹配1次或多次? - 该符号前面的字符是可选的。

匹配0 次或1 次。

\d - 匹配任何单个数字。

\w - 匹配任何一个字符(包括字母数字以及下划线)。

[XYZ] - 匹配字符组中的任意一个字符,即X、Y、Z 中的任意一个。

[XYZ]+ - 匹配字符组中的一个或多个字符。

$ - 匹配字符串结束的位置。

^ - 匹配字符串开始的位置。

[^a-z] - 当出现在字符类中时,^ 表示 NOT(非);对于该示例,表示匹配任何非小写字母。

很闷吧,不过仍是记住它们,记住以后你会明白益处的。

工具你以为一个表达式是正确的,超级正确,但就是无法取得想要的结果,这时你可能会产生将头发拔光的冲动。

去下载桌面应用程序吧,那个对你是必不可少的,而且玩起来超级有趣的。

它提供实时检查,还有一个侧边栏,里面包括了每一个字符的概念和用户,超级详细。

第二节:正则表达式傻瓜教程:抓屏视频下一步是学习如何真正地利用这些符号。

若是视频是你的偏好,那你走运了。

这里有五个课程的视频教程,超级适合你:“”。

(Jeffery Way:在这一系列视频教程中,我将交给你如安在JavaScript和PHP中高效的利用正则表达式。

我会假设你是从零开始。

)第三节:正则表达式和 JavaScript本节为最后一节,咱们来看看JavaScript 方式如何利用正则表达式。

正则表达式30分钟入门教程

正则表达式30分钟入门教程

正则表达式30分钟入门教程正则表达式是一种强大的文本匹配工具,可以在大量的文本数据中进行快速、准确的模式匹配和提取。

对于需要处理文本数据的开发人员和数据分析师来说,掌握正则表达式是非常重要的。

本文将带您在30分钟内入门正则表达式,让您能够快速上手使用。

一、什么是正则表达式?正则表达式是一种用于匹配、查找和替换文本的字符串模式。

它使用特定的语法规则来描述要匹配的字符序列。

正则表达式可以用于验证输入的有效性、从文本中提取特定的信息、替换文本中的指定部分等。

二、正则表达式的基本语法1. 字符匹配:正则表达式中的普通字符表示匹配该字符本身。

例如,正则表达式abc可以匹配字符串abc。

2. 字符类:用方括号[]表示,可以匹配方括号中任意一个字符。

例如,正则表达式[abc]可以匹配字符串a、b或c。

3. 量词:用于指定匹配的次数。

例如,正则表达式a{3}可以匹配3个连续的a字符。

4. 选择符:用竖线|表示,可以匹配多个模式中的一个。

例如,正则表达式a|b可以匹配字符串a或b。

5. 边界匹配:用于限定匹配的位置。

例如,^表示匹配字符串的开头,$表示匹配字符串的结尾。

三、常用的正则表达式示例1. 匹配手机号码:^\d{11}$2. 匹配邮箱地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$3. 匹配身份证号码:^\d{17}[\dXx]$4. 匹配URL地址:^[a-zA-Z]+://[^\s]*$5. 匹配日期:^\d{4}-\d{2}-\d{2}$6. 匹配IP地址:^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$四、常用的正则表达式工具1. 在Python中,可以使用re模块来操作正则表达式。

2. 在JavaScript中,可以使用RegExp对象来操作正则表达式。

3. 在文本编辑器中,可以使用正则表达式进行查找和替换。

五、常见问题解答问:如何匹配一个或多个任意字符?答:可以使用点号.来匹配一个任意字符,使用点号加上量词*来匹配一个或多个任意字符。

正则表达式基础知识

正则表达式基础知识

1.正则表达式入门(1)查找特定信息(2)查找并编辑特定信息从根本上来讲正则表达式有两个基本问题:搜索和替换。

正则表达式是一种用来匹配和处理文字的字符串。

正则表达式在不同的应用程序和怨言中各有不同。

正则表达式是文本处理方面最强大的工具之一。

正则表达式语言用来构造正则表达式,正则表达式用来完成搜索和替换操作。

2.匹配单个字符Ben是一个正则表达式。

正则表达式可以包含纯文本,甚至可以只包含纯文本文本:Hello my name is Ben.正则表达式:Ben结果:Hello my name is Ben.文本:Hello my name is Ben.Please visit my website.正则表达式:my结果:Hello my name is Ben.Please visite my website.绝大多数的正则表达式引擎的默认行为是只返回第一个匹配结果。

具体到上面的例子,原始文本的第一个my通常是一个,但第二个往往不是。

字母的大小写问题:正则表达式是区分大小写的,所以Ben不匹配ben。

不过绝大多数正则表达式的实现也支持不区分字母大小写的匹配操作。

匹配任意字符:前面的正则表达式都是静态的纯文本,下面看看如何用正则表达式去匹配不可预知的字符。

在正则表达式里,特殊字符用来给出要搜索的东西。

.字符可以匹配任意一个单个的字符。

文本:sales1.xlsorder3.xlssale2.xlssale3.xlsapac1.xlseurope2.xlsna1.xlsna2.xlssa1.xls正则表达式:Salessales1.xlsorder3.xlssale2.xlssale3.xlsapac1.xlseurope2.xlsna1.xlsna2.xlssa1.xls.字符可以匹配任何单个的字符,字母,数字甚至是.字符本身。

文本:sales.xlssales1.xlsorder3.xlssale2.xlssale3.xlsapac1.xlseurope2.xlsna1.xlsna2.xlssa1.xls正则表达式:sales.结果:sales.xlssales1.xlsorder3.xlssale2.xlssale3.xlsapac1.xlseurope2.xlsna1.xlsna2.xlssa1.xls在一个正则表达式里允许多个.字符,他们既可以连续出现,也可以间隔出现在模式的不同位置。

正则表达式基础知识

正则表达式基础知识

总则:1.选项均包含在括号中, 不同选项用"|"分开;2."\d"表示数字0-9;3.重复次数用"{}"表示,例如:(\d){2}表示重复前面的项,共2项,与(\d\d)表示的是一个意思;4."$"表示结尾;5."\"后边跟数字,表示重复括号中的内容,例如:(\d)\1重复第一个括号中的内容,如果是(\d)(0)\2表示重复第2个括号中的内容:0;6."[]"表示其中的内容任选其一,例如:(1)[1-6]表示11或12或13或14或15或16;举工作中的例子:电话号码正则表达式(0){3}(\d)$ 号码最后4位中,前3位是0,最后1位是数字0-9;(00|11|22|33|44|55|77)$ 末2位号码为00或11等等,中间用|分隔;(\d\d\d)\1$ ABCABC格式,\1表示重复第一个括号中的内容;(\d)\1(\d)\2$ AABB格式,\2表示重复第2个括号中的内容;(\d)\1(\d)\1$ AABA格式;(19\d{2}|200[0-7])$ 与(19\d\d|200[0-7])$表达意思相同,即后四位为1900-2007;((0[1,3,5,7,8]|1[0,2])(0[1-9]|[1,2]\d|3[0-1])|(0[4,6,9]|11)(0[1-9]|[1,2]\d|30) |(02)(0[1-9]|[1,2]\d))$判断后四位数字是否为日期格式,(0[1,3,5,7,8]|1[0,2])(0[1-9]|[1,2]\d|3[0-1])表示1,3,5,7,8,10,12月的1-9好,10-29号,30-31号.后边同理.正则表达式由一些普通字符和一些元字符(metacharacters)组成。

普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,我们下面会给予解释。

在最简单的情况下,一个正则表达式看上去就是一个普通的查找串。

例如,正则表达式"testing"中没有包含任何元字符,,它可以匹配"testing"和"123testing"等字符串,但是不能匹配"Testing"。

基础正则表达式

基础正则表达式

基础正则表达式
正则表达式是一种强大的文本处理工具,可以在文本中搜索匹配的字符串模式。

基础正则表达式包括以下内容:
1.元字符:元字符用于匹配特定的字符。

例如,.匹配除了换行符之外的任何
字符,*匹配前面的子表达式零次或多次,+匹配前面的子表达式一次或多次,?匹配前面的子表达式零次或一次,{n}精确匹配前面的子表达式n 次,{n,}至少匹配前面的子表达式 n 次,{n,m}匹配前面的子表达式至少 n 次且最多 m 次。

2.字符类:用方括号表示的字符集合,例如[aeiou]匹配任何一个英文元音字
母。

3.选择、分组和引用:|表示选择,( )表示分组,\后跟数字 n 表示引用第 n 个
分组的结果。

4.预定义模式:例如\d匹配任何数字,\D匹配任何非数字字符,\s匹配任何
空白字符,\S匹配任何非空白字符,\w匹配任何字母数字字符,\W匹配任何非字母数字字符。

5.边界:^匹配输入字符串的开始位置,$匹配输入字符串的结束位置。

6.注释:(?#comment)用于注释正则表达式的一部分。

这只是基础正则表达式的一部分,更复杂的正则表达式可以包括模式修饰符、反向引用、正向否定预查、后向肯定预查、零宽断言、贪婪/非贪婪匹配等高级特性。

VBA中的正则表达式入门指南

VBA中的正则表达式入门指南

VBA中的正则表达式入门指南正则表达式是一种强大而灵活的文本匹配工具,在VBA编程中被广泛应用。

通过使用正则表达式,我们可以轻松地处理和转换文本数据。

本文将为您提供一个入门指南,介绍VBA中正则表达式的基本概念、语法和常见应用。

一、正则表达式的基本概念正则表达式是一种模式匹配工具,可用于在文本中查找特定模式的字符串。

它由一系列字符和特殊符号组成,这些字符和符号表示匹配规则。

在VBA中,我们使用VBScript的正则表达式对象来处理正则表达式。

在正则表达式中,常用的特殊符号包括:1. 普通字符:匹配其字面值,例如字母、数字或特殊字符。

2. 元字符:具有特殊含义的字符,例如"."表示任何字符,"*"表示前一元素的零个或多个实例。

3. 字符类:用方括号括起来的一组字符,表示匹配其中的任意一个字符。

例如,"[abc]"表示匹配字符"a"、"b"或"c"其中之一。

4. 转义字符:用反斜杠“\”前缀的特殊字符,用于匹配原有特殊字符的字面值。

例如,"\."匹配句号。

二、VBA中使用正则表达式对象在VBA中,我们可以通过创建VBScript.RegExp对象来使用正则表达式。

以下是创建和使用正则表达式对象的基本步骤:1. 引用VBScript库:在VBA编辑器中,选择“工具”->“引用”,然后勾选“Microsoft VBScript Regular Expressions x.x”(版本可能因安装环境而异)。

2. 创建正则表达式对象:使用“Dim”语句创建一个VBScript.RegExp对象。

例如:```Dim regEx As VBScript.RegExpSet regEx = New VBScript.RegExp```3. 设置正则表达式模式:使用“Pattern”属性设置正则表达式的模式。

Python学习笔记——正则表达式入门

Python学习笔记——正则表达式入门

Python学习笔记——正则表达式⼊门# 本⽂对正则知识不做详细解释,仅作⼊门级的正则知识⽬录。

正则表达式的强⼤早有⽿闻,⼤⼀时参加⼀次选拔考试,题⽬就是⽤做个HTML解析器,正则的优势表现得淋漓尽致。

题外话不多讲,直接上⼲货:1. 元字符: 与之对应的还有反义字符,⼤部分为⼩写字母变⼤写,例如\D表⽰匹配⾮数字的字符。

2. 重复(即匹配变长的字符串): 元字符可匹配单⼀的字符类型,若想匹配长度未知或长度限定的字符串需要在后边加上限定符。

3. 范围与分组: 有时元字符并不能满⾜匹配字符的需求,这时就需要[]来圈定匹配范围,例如要匹配⼀个只带有a,s,d,f的单词,可以⽤\b[asdf]\b;正则⾥⾯还有⼩括号⽤来表⽰分组,⽐如你想重复某⼏个字符,就可以使⽤分组,例如(\d.\d){1,3}表⽰匹配⼩括号⾥的重复内容⼀到三次。

此外,⼩括号还可以⽤来后向引⽤等,此处不记。

4. 零宽断⾔: 零宽断⾔主要⽤来查找在某些断⾔(指定内容)之前或之后的内容,例如(?=exp)匹配表达式exp前⾯出现的内容(不匹配exp),(?<=exp)匹配表达式exp后⾯出现的内容,还有负向零宽断⾔等此处不记。

5. 贪婪与懒惰: 当正则表达式中包含能接受重复的限定符时,通常的⾏为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,即贪婪匹配。

如表达式a.*b,搜索aabab的话,它会匹配整个字符串aabab。

⽽懒惰匹配会匹配尽可能少的字符串,只需要在限定符后⾯加⼀个?,例如a.*?b会匹配aab(第⼀到第三个字符)和ab(第四到第五个字符)。

6. Python的re模块: python 提供re模块,提供正则的所有功能。

下⾯只记两个⽅法和⼀个注意的地⽅。

6.1 match⽅法: match()⽅法判断是否匹配,如果匹配成功,返回⼀个Match对象,否则返回None。

1 >>> import re2 >>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')3 <_sre.SRE_Match object at 0x1026e18b8>4 >>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')5 >>> 如果正则表达式中定义了组,就可以在Match对象上⽤group()⽅法提取出⼦串来。

python 常见正则表达式

python 常见正则表达式

python 常见正则表达式Python常见正则表达式正则表达式是一种用来匹配和处理字符串的强大工具,它在Python开发中被广泛使用。

在正则表达式中,中括号内的内容用来指定匹配模式,本文将一步一步地介绍Python中常见的正则表达式。

一、基本元字符和字符类:1. \d:匹配一个数字字符。

等效于[0-9]。

2. \D:匹配一个非数字字符。

等效于[^0-9]。

3. \w:匹配一个单词字符。

等效于[a-zA-Z0-9_]。

4. \W:匹配一个非单词字符。

等效于[^a-zA-Z0-9_]。

5. \s:匹配一个空白字符,包括空格、制表符和换行符。

6. \S:匹配一个非空白字符。

7. \b:匹配单词边界。

8. \B:匹配非单词边界。

二、重复匹配:1. *:匹配前面的表达式0次或多次。

2. +:匹配前面的表达式1次或多次。

3. ?:匹配前面的表达式0次或1次。

4. {n}:匹配前面的表达式恰好n次。

5. {n,}:匹配前面的表达式至少n次。

6. {n, m}:匹配前面的表达式至少n次,最多m次。

三、字符类:1. []:匹配方括号中的任意一个字符。

例如,[abc]匹配'a'、'b'或'c'。

2. [^]:匹配除了方括号中的字符以外的任意一个字符。

例如,[^xyz]匹配任意一个不是'x'、'y'或'z'的字符。

3. [a-z]:匹配任意一个小写字母。

4. [A-Z]:匹配任意一个大写字母。

5. [0-9]:匹配任意一个数字。

四、转义字符:1. \:将后面的字符视为普通字符,而不是特殊字符。

例如,\.匹配'.'。

2. \t:制表符。

3. \n:换行符。

4. \\:反斜杠。

五、常见正则表达式应用:1. 匹配邮箱:\w+\w+\.[a-zA-Z]+import redef validate_email(email):pattern = r'\w+\w+\.[a-zA-Z]+'if re.match(pattern, email):return Trueelse:return Falseemail = input("请输入邮箱地址: ")if validate_email(email):print("邮箱地址有效")else:print("邮箱地址无效")2. 匹配手机号码:1[345789]\d{9}import redef validate_phone_number(phone_number): pattern = r'1[345789]\d{9}'if re.match(pattern, phone_number):return Trueelse:return Falsephone_number = input("请输入手机号码: ")if validate_phone_number(phone_number): print("手机号码有效")else:print("手机号码无效")3. 匹配IP地址:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} import redef validate_ip_address(ip_address):pattern = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' if re.match(pattern, ip_address):return Trueelse:return Falseip_address = input("请输入IP地址: ")if validate_ip_address(ip_address):print("IP地址有效")else:print("IP地址无效")通过以上示例,可以看出正则表达式在实际开发中的应用非常广泛。

[精品]正则表达式基础知识(图文).doc

[精品]正则表达式基础知识(图文).doc

正则表达式基础知识(图文)2008-10-23 19:46我们先从简单的开始。

假设你要搜索一个包含字符"cal”的字符串,搜索用的正则表达式就是“询”。

如果搜索对大小写不敏感,单讨'catalog,\ "Catherine"、"sophisticated'"都可以匹配。

也就是说:th则表达式:cat匹配:cat. cataIog. Cather ine. sophi sti cated1・1句点符号假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。

另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。

要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。

这样,完整的表达式就是“5”,它匹配“伽”、“ten”、5n”和“ion”,还匹配伽”、“ipn”甚至“in”,还有其他许多无意义的组合。

这是因为句点符匕匹配所仔宇符,包括空格、Tab 字符甚至换行符:正则表达式:t.n匹©己:tani Teni tini tone t m t#ni tpni 尊1. 2方括号符号为了解决句点符号匹配范囤过于广泛这一问题,你可以在方括号(“[]”)里血指定看來有意义的字符。

此时,只有方括号里面指定的字符才参与匹配。

也就是说,正则表达式“t[aeio]n"只匹配“tan”、“Ten”、“tin" 和%onj但"ToorT不匹配,因为在方括号之内你只能匹配单个字符:正则表达式:t[aeio]n 匹配:tani Twru tint ton1.3 “或”符号如果除了上面匹配的所有单词之外,你还想要匹配"toon”,那么,你可以使用T操作符。

T操作符的基本意义就是“或''运算•要匹配“toon”,使用-t(alcliloloo)n-正则表达式。

正则表达式知识详解

正则表达式知识详解

正则表达式知识详解⼀、什么是正则表达式?1.定义:正则表达式(regular expression)描述了⼀种字符串匹配的模式,可以⽤来检查⼀个串是否含有某种⼦串、将匹配的⼦串做替换或者从某个串中取出符合某个条件的⼦串等。

构造正则表达式的⽅法和创建数学表达式的⽅法⼀样。

也就是⽤多种元字符与运算符可以将⼩的表达式结合在⼀起来创建更⼤的表达式。

正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

2.组成:正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的⽂字模式。

模式描述在搜索⽂本时要匹配的⼀个或多个字符串。

正则表达式作为⼀个模板,将某个字符模式与所搜索的字符串进⾏匹配。

3.何时使⽤:验证——从头到尾完整匹配!查找——只要部分匹配即可!⼆、正则表达式的基本语法和规则1.备选字符集:规定某*⼀位字符*可⽤的备选字符的集合语法:[可选字符列表]强调:1. ⽆论备选字符集包含多少字符,只能选1个2. 必须选1个!⽐如:6位数字的密码[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]简化:1. 当备选字符连续时,可⽤-表⽰范围的区间⽐如:[0123456789]-->[0-9][0-9][0-9][0-9][0-9][0-9][0-9][a-z]-->1位⼩写字母[A-Z]-->1位⼤写字母[A-Za-z]-->1位字母,⼤⼩写都⾏[0-9a-zA-Z]-->1位字母或数字都⾏反选:[^不能选的字符列表]⽐如:[^47] 强调:^作“除了”使⽤时,只能放在开头2. 预定义字符集:为常⽤的字符集专门提供的简化写法!“\d”-->[0-9]-->1位数字“\w”-->[0-9a-zA-Z_]-->1位字母,数字或_“\s”-->1位空字符:匹配任何空⽩字符,包括空格、制表符、换页符等等。

最全常用正则表达式大全

最全常用正则表达式大全

最全常⽤正则表达式⼤全⼀、校验数字的表达式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]+(.[0-9]{2})?$10. 有1~3位⼩数的正实数:^[0-9]+(.[0-9]{1,3})?$11. ⾮零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$12. ⾮零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$13. ⾮负整数:^\d+$ 或 ^[1-9]\d*|0$14. ⾮正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$15. ⾮负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$16. ⾮正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$17. 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$18. 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$19. 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$⼆、校验字符的表达式1. 汉字:^[\u4e00-\u9fa5]{0,}$2. 英⽂和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$3. 长度为3-20的所有字符:^.{3,20}$4. 由26个英⽂字母组成的字符串:^[A-Za-z]+$5. 由26个⼤写英⽂字母组成的字符串:^[A-Z]+$6. 由26个⼩写英⽂字母组成的字符串:^[a-z]+$7. 由数字和26个英⽂字母组成的字符串:^[A-Za-z0-9]+$8. 由数字、26个英⽂字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$9. 中⽂、英⽂、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$10. 中⽂、英⽂、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$11. 可以输⼊含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+ 12 禁⽌输⼊含有~的字符:[^~\x22]+三、特殊需求表达式1. Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$2. 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?4. ⼿机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$5. 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$6. 国内电话号码(0511-*******、021-********):\d{3}-\d{8}|\d{4}-\d{7}7. ⾝份证号(15位、18位数字):^\d{15}|\d{18}$8. 短⾝份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$9. 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$10. 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$11. 强密码(必须包含⼤⼩写字母和数字的组合,不能使⽤特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$12. ⽇期格式:^\d{4}-\d{1,2}-\d{1,2}13. ⼀年的12个⽉(01~09和1~12):^(0?[1-9]|1[0-2])$14. ⼀个⽉的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$15. 钱的输⼊格式:16. 1.有四种钱的表⽰形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$17. 2.这表⽰任意⼀个不以0开头的数字,但是,这也意味着⼀个字符"0"不通过,所以我们采⽤下⾯的形式:^(0|[1-9][0-9]*)$18. 3.⼀个0或者⼀个不以0开头的数字.我们还可以允许开头有⼀个负号:^(0|-?[1-9][0-9]*)$19. 4.这表⽰⼀个0或者⼀个可能为负的开头不为0的数字.让⽤户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下⾯我们要加的是说明可能的⼩数部分:^[0-9]+(.[0-9]+)?$20. 5.必须说明的是,⼩数点后⾯⾄少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$21. 6.这样我们规定⼩数点后⾯必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$22. 7.这样就允许⽤户只写⼀位⼩数.下⾯我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$23 8.1到3个数字,后⾯跟着任意个逗号+3个数字,逗号成为可选,⽽不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$24. 备注:这就是最终结果了,别忘了"+"可以⽤"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在⽤函数时去掉去掉那个反斜杠,⼀般的错误都在这⾥25. xml⽂件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$26. 中⽂字符的正则表达式:[\u4e00-\u9fa5]27. 双字节字符:[^\x00-\xff] (包括汉字在内,可以⽤来计算字符串的长度(⼀个双字节字符长度计2,ASCII字符计1))28. 空⽩⾏的正则表达式:\n\s*\r (可以⽤来删除空⽩⾏)29. HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (⽹上流传的版本太糟糕,上⾯这个也仅仅能部分,对于复杂的嵌套标记依旧⽆能为⼒)30. ⾸尾空⽩字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以⽤来删除⾏⾸⾏尾的空⽩字符(包括空格、制表符、换页符等等),⾮常有⽤的表达式)31. 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)32. 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)33. IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有⽤)34. IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))。

最新最详细的正则表达式入门教程

最新最详细的正则表达式入门教程

最新最详细的正则表达式入门教程
一、正则表达式到底是什么东西?
正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。

正则表达式用法单个字符串来描述、匹配一系列符合某个句规矩则的字符串。

在无数文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

在编写处理字符串的程序或网页时,常常会有查找符合某些复杂规章的字符串的需要。

正则表达式就是用于描述这些规章的工具。

换句话说,正则表达式就是记录文本规章的代码。

你用法过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。

假如你想查找某个名目下的全部的Word文档的话,你会搜寻*.doc。

在这里,*会被说明成随意的字符串。

和通配符类似,正则表达式也是用来举行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求&mdash;&mdash;固然,代价就是更复杂&mdash;&mdash;比如你可以编写一个正则表达式,用来查找全部以0开始,后面跟着2-3个数字,然后是一个连字号-,最后是7或8位数字的字符串(像010-********或0321-7654321)。

二、初识正则表达式
学习正则表达式的最好办法是从例子开头,理解例子之后再对例子举行修改,试验。

下面给出了不少容易的例子,并对它们作了具体的解释。

第1页共3页。

30分钟学会正则表达式

30分钟学会正则表达式

半小时教你学会正则表达式分类:PHP 半小时教你学会正则表达式想必很多人都对正则表达式都头疼.今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式.来和大家分享学习经验开篇:我们来说说^ 和$ 这两个字符,他们是分别用来匹配字符串的开始和结束,即 ^ 表示开始$ 表示结束以下分别举例说明:"^The": 表示开头一定要有"The"字符串;"of despair$": 表示结尾一定要有"of despair" 的字符串;"^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配。

"notice": 则只能匹配包含notice的字符串。

因为你没有用正则表达式模式符号 ^ 或 $ 锁定他的开头和结尾,所以它可以出现在被检验字符串的任何地方。

接着:我们来说说 * 、+ 和 ? 这三个字符。

他们是用来表示一个字符可以出现的次数或者顺序的:* 表示0个或更多,相当于{0,};+ 表示1个或更多,相当于{1,};?表示0个或1个,相当于{0,1};例如:"ab*": 和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串("a", "ab", "abbb", 等); "ab+": 和ab{1,}同义,匹配以a开头,但最少要有一个b存在("ab", "abbb", 等.);"ab?": 和ab{0,1}同义,可以没有或者只有一个b;"a?b+$": 匹配以1个或者0个a再加上一个以上的b结尾的字符串.要点:'*', '+',和'?'只管它前面那个字符.你也可以在大括号里面限制字符出现的个数,比如"ab{2}": 要求a后面一定要跟两个b(一个也不能少)("abb");"ab{2,}": 要求a后面一定要有两个或者两个以上b(如"abb", "abbbb", 等.);"ab{3,5}": 要求a后面可以有3-5个b("abbb", "abbbb", or "abbbbb").现在我们把一定几个字符放到小括号里,比如:"a(bc)*": 匹配a 后面跟0个或者一个"bc";"a(bc){1,5}": 一个到5个"bc."还有一个字符'│', 相当于OR 操作:"hi│hello": 匹配含有"hi" 或者"hello" 的字符串;"(b│cd)ef": 匹配含有"bef" 或者"cdef"的字符串;"(a│b)*c": 匹配含有这样多个(包括0个)a或b,后面跟一个c 的字符串;一个点('.')可以代表所有的单一字符,不包括"n"如果,要匹配包括"n"在内的所有单个字符,怎么办?对了,用'[n.]'这种模式."a.[0-9]": 一个a加一个字符再加一个0到9的数字"^.{3}$": 三个任意字符结尾.中括号括住的内容只匹配一个单一的字符,例如:"[ab]": 匹配单个的 a 或者b ( 和"a│b" 一样);"[a-d]": 匹配'a' 到'd'的单个字符(和"a│b│c│d" 还有"[abcd]"效果一样);一般我们都用[a-zA-Z]来指定字符为一个大小写英文"^[a-zA-Z]": 匹配以大小写字母开头的字符串"[0-9]%": 匹配含有形如x%的字符串",[a-zA-Z0-9]$": 匹配以逗号再加一个数字或字母结尾的字符串你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用'^' 作为开头"%[^a-zA-Z]%" 匹配含有两个百分号里面有一个非字母的字符串.要点:^用在中括号开头的时候,就表示排除括号里的字符为了PHP能够解释,你必须在这些字符面前后加'',并且将一些字符转义.不要忘记在中括号里面的字符是这条规路的例外——在中括号里面, 所有的特殊字符,包括(''), 都将失去他们的特殊性质"[*+?{}.]"匹配含有这些字符的字符串.还有,正如regx的手册告诉我们:"如果列表里含有']', 最好把它作为列表里的第一个字符(跟在'^'后面).如果含有'-', 最好把它放在最前面或者最后面, or 或者一个范围的第二个结束点[a-d-0-9]中间的‘-’将有效.看了上面的例子,你对{n,m}应该理解了吧.要注意的是,n和m都不能为负整数,而且n总是小于m. 这样,才能最少匹配n次且最多匹配m次. 如"p{1,5}"将匹配"pvpppppp"中的前五个p下面说说以开头的b 书上说他是用来匹配一个单词边界,就是...比如'veb',可以匹配love里的ve而不匹配very里的veB 正好和上面的b相反.例子我就不举了好,我们来做个应用: 如何构建一个模式来匹配货币数量的输入?构建一个匹配模式去检查输入的信息是否为一个表示money的数字。

正则表达式入门(ed模糊匹配)

正则表达式入门(ed模糊匹配)

正则表达式⼊门(ed模糊匹配)元字符:/b 代表着单词的开头或结尾,也就是单词的分界处.如果要精确地查找hi这个单词的话,我们应该使⽤/bhi/b..是另⼀个元字符,匹配除了换⾏符以外的任意字符,*同样是元字符,它指定*前边的内容可以重复任意次以使整个表达式得到匹配。

.*连在⼀起就意味着任意数量的不包含换⾏的字符。

/d是⼀个新的元字符,匹配任意的数字,0/d/d-/d/d/d/d/d/d/d/d也就是中国的电话号码.为了避免那么多烦⼈的重复,我们也可以这样写这个表达式:0/d{2}-/d{8}。

/s匹配任意的空⽩符,包括空格,制表符(Tab),换⾏符,中⽂全⾓空格等。

/w匹配字母或数字或下划线或汉字。

/b/w{6}/b 匹配刚好6个字母/数字的单词。

字符转义:使⽤/来取消这些字符的特殊意义。

因此,你应该使⽤/.和/*。

当然,要查找/本⾝,你也得⽤//。

代码说明. 匹配除换⾏符以外的任意字符/w 匹配字母或数字或下划线或汉字/s 匹配任意的空⽩符/d 匹配数字/b 匹配单词的开始或结束^ 匹配字符串的开始$ 匹配字符串的结束重复:常⽤的限定符代码/语法说明* 重复零次或更多次+ 重复⼀次或更多次重复零次或⼀次{n} 重复n次{n,} 重复n次或更多次{n,m} 重复n到m次要想查找数字,字母或数字,你只需要在中括号⾥列出它们就⾏了,像[aeiou]就匹配任何⼀个元⾳字母,[.?!]匹配标点符号(.或?或!)反义:常⽤的反义代码代码/语法说明/W 匹配任意不是字母,数字,下划线,汉字的字符/S 匹配任意不是空⽩符的字符/D 匹配任意⾮数字的字符/B 匹配不是单词开头或结束的位置[^x] 匹配除了x以外的任意字符[^aeiou] 匹配除了aeiou这⼏个字母以外的任意字符替换:正则表达式⾥的替换指的是有⼏种规则,如果满⾜其中任意⼀种规则都应该当成匹配,具体⽅法是⽤|把不同的规则分隔开。

0/d{2}-/d{8}|0/d{3}-/d{7}这个表达式能匹配两种以连字号分隔的电话号码:⼀种是三位区号,8位本地号(如010-********),⼀种是4位区号,7位本地号(0376-*******)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/b 代表着单词的开头或结尾,也就是单词的分界处.如果要精确地查找hi这个单词的话,我们应该使用/bhi/b..是另一个元字符,匹配除了换行符以外的任意字符,*同样是元字符,它指定*前边的内容可以重复任意次以使整个表达式得到匹配。

.*连在一起就意味着任意数量的不包含换行的字符。

/d是一个新的元字符,匹配任意的数字,0/d/d‐/d/d/d/d/d/d/d/d也就是中国的电话号码.为了避免那么多烦人的重复,我们也可以这样写这个表达式:0/d{2}‐/d{8}。

/s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。

/w匹配字母或数字或下划线或汉字。

/b/w{6}/b 匹配刚好6个字母/数字的单词。

字符转义:使用/来取消这些字符的特殊意义。

因此,你应该使用/.和/*。

当然,要查找/本身,你也得用//。

代码 说明. 匹配除换行符以外的任意字符/w 匹配字母或数字或下划线或汉字/s 匹配任意的空白符/d 匹配数字/b 匹配单词的开始或结束^ 匹配字符串的开始$ 匹配字符串的结束重复:常用的限定符代码/语法 说明* 重复零次或更多次+ 重复一次或更多次? 重复零次或一次{n} 重复n次{n,} 重复n次或更多次{n,m} 重复n到m次要想查找数字,字母或数字,你只需要在中括号里列出它们就行了,像[aeiou]就匹配任何一个元音字母,[.?!]匹配标点符号(.或?或!)常用的反义代码代码/语法 说明/W 匹配任意不是字母,数字,下划线,汉字的字符/S 匹配任意不是空白符的字符/D 匹配任意非数字的字符/B 匹配不是单词开头或结束的位置[^x] 匹配除了x以外的任意字符[^aeiou] 匹配除了aeiou这几个字母以外的任意字符替换:正则表达式里的替换指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。

0/d{2}‐/d{8}|0/d{3}‐/d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010‐12345678),一种是4位区号,7位本地号(0376‐2233445)。

/(0/d{2}/)[‐ ]?/d{8}|0/d{2}[‐ ]?/d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。

你可以试试用替换|把这个表达式扩展成也支持4位区号的。

/d{5}‐/d{4}|/d{5}这个表达式用于匹配美国的邮政编码。

美国邮编的规则是5位数字,或者用连字号间隔的9位数字。

之所以要给出这个例子是因为它能说明一个问题:使用替换时,顺序是很重要的。

如果你把它改成/d{5}|/d{5}‐/d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。

原因是匹配替换时,将会从左到右地测试每个分枝条件,如果满足了某个分枝的话,就不会去管其它的替换条件了。

分组:如果想要重复一个字符串又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。

(/d{1,3}/.){3}/d{1,3}是一个简单的IP地址匹配表达式。

要理解这个表达式,请按下列顺序分析它:/d{1,3}匹配1到3位的数字,(/d{1,3}/.}{3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(/d{1,3})。

不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址(IP地址中每个数字都不能大于255)。

如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0‐4]/d|25[0‐5]|[01]?/d/d?)/.){3}(2[0‐4]/d|25[0‐5]|[01]?/d/d?)。

后向引用:后向引用用于重复搜索前面某个分组匹配的文本。

例如,/1代表分组1匹配的文本。

难以理解?请看示例:/b(/w+)/b/s+/1/b可以用来匹配重复的单词,像go go, kitty kitty。

首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(/b(/w+)/b),然后是1个或几个空白符(/s+,最后是前面匹配的那个单词(/1)。

懒惰限定符*? 重复任意次,但尽可能少重复+? 重复1次或更多次,但尽可能少重复?? 重复0次或1次,但尽可能少重复{n,m}? 重复n到m次,但尽可能少重复{n,}? 重复n次以上,但尽可能少重复位置指定:接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们用于指定一个位置,就像/b,^,$那样,因此它们也被称为零宽断言。

最好还是拿例子来说明吧:(?=exp)也叫零宽先行断言,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀exp。

比如/b/w+(?=ing/b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如果在查找I'm singing while you're dancing.时,它会匹配sing和danc。

(?<=exp)也叫零宽后行断言,它匹配文本中的某些位置,这些位置的前面能给定的前缀匹配exp。

比如(?<=/bre)/w+/b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。

假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=/d)/d{3})*/b。

请仔细分析这个表达式,它可能不像你第一眼看出来的那么简单。

下面这个例子同时使用了前缀和后缀:(?<=/s)/d+(?=/s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。

负向位置指定:前面我们提到过怎么查找不是某个字符或不在某个字符类里的字符的方法(反义)。

但是如果我们只是想要确保某个字符没有出现,但并不想去匹配它时怎么办?例如,如果我们想查找这样的单词‐‐它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样:/b/w*q[^u]/w*/b匹配包含后面不是字母u的字母q的单词。

但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q出现在单词的结尾的话,像Iraq,Benq,这个表达式就会出错。

这是因为[^u]总是匹配一个字符,所以如果q是单词的最后一个字符的话,后面的[^u]将会匹配q后面的单词分隔符(可能是空格,或者是句号或其它的什么),后面的/w+/b将会匹配下一个单词,于是/b/w*q[^u]/w*/b就能匹配整个Iraq fighting。

负向位置指定能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。

现在,我们可以这样来解决这个问题:/b/w*q(?!u)/w*/b。

零宽负向先行断言(?!exp),只会匹配后缀exp不存在的位置。

/d{3}(?!/d)匹配三位数字,而且这三位数字的后面不能是数字。

同理,我们可以用(?<!exp),零宽负向后行断言来查找前缀exp不存在的位置:(?<![a‐z])/d{7}匹配前面不是小写字母的七位数字(实验时发现错误?注意你的“区分大小写”先项是否选中)。

一个更复杂的例子:(?<=<(/w+)>).*(?=<///1>)匹配不包含属性的简单HTML标签内里的内容。

(<?(/w+)>)指定了这样的前缀:被尖括号括起来的单词(比如可能是<b>),然后是.*(任意的字符串),最后是一个后缀(?=<///1>)。

注意后缀里的//,它用到了前面提过的字符转义;/1则是一个反向引用,引用的正是捕获的第一组,前面的(/w+)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了。

整个表达式匹配的是<b>和</b>之间的内容(再次提醒,不包括前缀和后缀本身)。

注释:小括号的另一种用途是能过语法(?#comment)来包含注释。

例如:2[0‐4]/d(?#200‐249)|25[0‐5](?#250‐255)|[01]?/d/d?(?#0‐199)。

要包含注释的话,最好是启用“忽略模式里的空白符”选项,这样在编写表达式时能任意的添加空格,Tab,换行,而实际使用时这些都将被忽略。

启用这个选项后,在#后面到这一行结束的所有文本都将被当成注释忽略掉。

例如,我们可以前面的一个表达式写成这样:(?<= # 查找前缀,但不包含它<(/w+)> # 查找尖括号括起来的字母或数字(标签)) # 前缀结束.* # 匹配任意文本(?= # 查找后缀,但不包含它<///1> # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签) # 后缀结束贪婪与懒惰:当正则表达式中包含能接受重复的限定符(指定数量的代码,例如*,{5,12}等)时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。

考虑这个表达式:a.*b,它将会匹配最长的以a开始,以b结束的字符串。

如果用它来搜索aabab的话,它会匹配整个字符串aabab。

这被称为贪婪匹配。

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。

前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。

这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

现在看看懒惰版的例子吧:a.*?b匹配最短的,以a开始,以b结束的字符串。

如果把它应用于aabab的话,它会匹配aab和ab(为什么第一个匹配是aab而不是ab?简单地说,最先开始的区配最有最大的优先权——The Match That Begins Earliest Wins)。

表5.懒惰限定符 *? 重复任意次,但尽可能少重复+? 重复1次或更多次,但尽可能少重复?? 重复0次或1次,但尽可能少重复{n,m}? 重复n到m次,但尽可能少重复{n,}? 重复n次以上,但尽可能少重复‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐下面是一些常用的正则表达式:匹配中文字符的正则表达式: [/u4e00‐/u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了匹配双字节字符(包括汉字在内):[^/x00‐/xff]评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)匹配空白行的正则表达式:/n/s*/r评注:可以用来删除空白行匹配HTML标记的正则表达式:<(/S*?)[^>]*>.*?<//1>|<.*? />评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力匹配首尾空白字符的正则表达式:^/s*|/s*$评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式匹配Email地址的正则表达式:/w+([‐+.]/w+)*@/w+([‐.]/w+)*/./w+([‐.]/w+)*评注:表单验证时很实用匹配网址URL的正则表达式:[a‐zA‐z]+://[^/s]*评注:网上流传的版本功能很有限,上面这个基本可以满足需求匹配帐号是否合法(字母开头,允许5‐16字节,允许字母数字下划线):^[a‐zA‐Z][a‐zA‐Z0‐9_]{4,15}$评注:表单验证时很实用匹配国内电话号码:/d{3}‐/d{8}|/d{4}‐/d{7}评注:匹配形式如 0511‐4405222 或 021‐87888822匹配腾讯QQ号:[1‐9][0‐9]{4,}评注:腾讯QQ号从10000开始匹配中国邮政编码:[1‐9]/d{5}(?!/d)评注:中国邮政编码为6位数字匹配身份证:/d{15}|/d{18}评注:中国的身份证为15位或18位匹配ip地址:/d+/./d+/./d+/./d+评注:提取ip地址时有用匹配特定数字:^[1‐9]/d*$ //匹配正整数^‐[1‐9]/d*$ //匹配负整数^‐?[1‐9]/d*$ //匹配整数^[1‐9]/d*|0$ //匹配非负整数(正整数 + 0)^‐[1‐9]/d*|0$ //匹配非正整数(负整数 + 0)^[1‐9]/d*/./d*|0/./d*[1‐9]/d*$ //匹配正浮点数^‐([1‐9]/d*/./d*|0/./d*[1‐9]/d*)$ //匹配负浮点数^‐?([1‐9]/d*/./d*|0/./d*[1‐9]/d*|0?/.0+|0)$ //匹配浮点数^[1‐9]/d*/./d*|0/./d*[1‐9]/d*|0?/.0+|0$ //匹配非负浮点数(正浮点数 + 0) ^(‐([1‐9]/d*/./d*|0/./d*[1‐9]/d*))|0?/.0+|0$//匹配非正浮点数(负浮点数 + 0) 评注:处理大量数据时有用,具体应用时注意修正匹配特定字符串:^[A‐Za‐z]+$//匹配由26个英文字母组成的字符串^[A‐Z]+$//匹配由26个英文字母的大写组成的字符串^[a‐z]+$//匹配由26个英文字母的小写组成的字符串^[A‐Za‐z0‐9]+$//匹配由数字和26个英文字母组成的字符串^/w+$//匹配由数字、26个英文字母或者下划线组成的字符串评注:最基本也是最常用的一些表达式b]常用的元字符[/b]代码 说明. 匹配除换行符以外的任意字符\w 匹配字母或数字或下划线或汉字\s 匹配任意的空白符\d 匹配数字\b 匹配单词的开始或结束^ 匹配字符串的开始$ 匹配字符串的结束{}重复次数[] 表示范围例子:\ba\w*\b 匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)。

相关文档
最新文档