正则 不能有中文逗号_最全正则表达式手册,给你呈上!

5ae2947d5cee1f5cc892d181720cab1e.gif

正则表达式完全手册

1.正则表达式介绍

1.1 POSIX

在20世纪80年代,UNIX成为一款非常受欢迎的商业操作系统,但是直到1988年,UNIX世界仍然一片混乱。许多电脑制造商从UNIX的创造者AT&T获得了 UNIX源代码授权,并且都发行了不同版本的操作系统产品。然而,制造商在努力追求产品差异化的同时,每个制造商都增加了自己专用的变化以及扩展,这就渐渐限制了软件的兼容性。由于一直由专有厂商销售,所以每一个厂商都想尽办法锁定它们的客户群。UNIX史上的这段黑暗时期被大家称之为"割据  时代"。

接着,我们进入了IEEE(Institute of Electrical and  Electronics  Engineers)时代。在20世纪80年代中期,IEEE开始开发一套规范UNIX和类UNIX系统工作方式的标准。这些标准,官方名称是IEEE 1003,定义了应用程序接口(API)、shell以及一些实用程序,它们可以在标准类UNIX系统中找到。该标准由Richard Stallman提议命名为POSIX,它是Portable Operating System Interface(末尾增加X只是为了更流畅)的缩写,后来被IEEE采纳。

1.2 POSIX的BRE与ERE

POSIX规范将正则表达式的实现方法分为了两种:基本正则表达式(BRE)和扩展正则表   达式(ERE)。到目前为止,我们所讨论的正则表达式的所有特性,都得到了兼容POSIX的应用程序的支持,并且都是以BRE的方式实现。 grep命令就是这样的一个例子。

1.3 基本正则表达式

1.3.1 普通字符

字母、数字、汉字、下划线,以及没有被定义特殊意义的标点符号,都是 "普通字符"。

如果一个表达式中,所有的字符都是 "普通字符",那么这个表达式的匹配操作,实际上就是一个普通的 "字符串查找"操作。

1.3.2 简单的转义字符

一些不便书写的字符,比如换行符,制表符等,使用\n,\t 来表示。另外有一些标点符号在正则表达式中,被定义了特殊的意义,因此需要在前面加 "" 进行转义后,匹配该字符本身。

表达式

可匹配

\r,\n

代表回车和换行符

\t

制表符

\

代表 "" 本身

还有其他一些在后边章节中有特殊用处的标点符号,在前面加 "" 后,就代表该符号本身.比如:^, 都有特殊意义, 如果要想匹配字符串中 "^" 和 "" 字符,则表达式就需要写成 "^" 和 "$"。

表达式

可匹配

\^

匹配 ^ 符号本身

\$

匹配 $ 符号本身

\.

匹配小数点(.)本身

1.3.3 字符集

正则表达式中的一些表示方法,可以匹配 '多种字符' 其中的任意一个字符。比如,表达式 "\d" 可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。就好比打斗地主天地赖子局的时候,赖子可以代表任何一张普通牌一样。

表达式

可匹配

\d

任意一个数字,0~9 中的任意一个

\w

任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个

\s

包括空格、制表符、换页符等空白字符的其中任意一个

.

小数点可以匹配除了换行符(\n)以外的任意一个字符

举例1:

表达式 "^aaa" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "^" 要求与字符串开始的地方匹配,因此,只有当 "aaa" 位于字符串的开头的时候,"^aaa" 才能匹配,点击测试 比如:"aaa xxx xxx"。

举例2:

表达式 "aaa" 在匹配 “xxxaaaxxx”时,匹配结果是: 失败。因为“”要求与字符串结束的地方匹配,因此, 只有当 "aaa" 位于字符串的结尾的时候,"aaa$" 才能匹配,点击测试 比如:"xxx xxx aaa"。

举例3:

表达式 ".\b." 在匹配 "@@@abc" 时,匹配结果是:成功;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。 进一步说明:"\b" 与 "^" 和 "$" 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 "\w" 范围,另一边是 非"\w" 的范围。

举例4:

表达式 "\bend\b" 在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";匹配到的位置是:开始于15,结束于18。

1.3.4 自定义字符集

使用方括号[ ] 包含一系列字符,能够匹配其中任意一个字符。用[^ ]包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。

表达式

可匹配

[ab5@]

匹配 "a" 或 "b" 或 "5" 或 "@"

[^abc]

匹配 "a","b","c" 之外的任意一个字符

[f-k]

匹配 "f"~"k" 之间的任意一个字母

[^A-F0-3]

匹配 "A"~"F","0"~"3" 之外的任意一个字符

1.3.5 匹配次数

前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。

使用方法是:"次数修饰"放在"被修饰的表达式"后边。比如:"[bcd][bcd]" 可以写成 "[bcd]{2}"。

表达式

作用

{n}

表达式重复n次,比如: "\w{2}" 相当于 "\w\w"; "a{5}" 相当于 "aaaaa"

{m,n}

表达式至少重复m次,最多重复n次,比如: "ba{1,3}"可以匹配 "ba"或"baa"或"baaa"

{m,}

表达式至少重复m次,比如: "\w\d{2,}"可以匹配 "a12","_456","M12344"...

?

匹配表达式0次或者1次,相当于 {0,1},比如: "a[cd]?"可以匹配 "a","ac","ad"

+

表达式至少出现1次,相当于 {1,},比如: "a+b"可以匹配 "ab","aab","aaab"...

*

表达式不出现或出现任意次,相当于 {0,},比如: "\^*b"可以匹配 "b","^^^b"...

1.3.6 其他特殊符号

表达式

作用

^

与字符串开始的地方匹配,不匹配任何字符

$

与字符串结束的地方匹配,不匹配任何字符

\b

匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符

进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。

举例1:

表达式 "^aaa" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "^" 要求与字符串开始的地方匹配,因此,只有当 "aaa" 位于字符串的开头的时候,"^aaa" 才能匹配, 比如:"aaa xxx xxx"。

举例2:

表达式 "aaa”在匹配“xxxaaaxxx”时,匹配结果是: 失败。因为“”要求与字符串结束的地方匹配,因此, 只有当 "aaa" 位于字符串的结尾的时候,"aaa$" 才能匹配,比如:"xxx xxx aaa"。

举例3:

表达式 ".\b." 在匹配 "@@@abc" 时,匹配结果是:成功;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。 进一步说明:"\b" 与 "^" 和 "$" 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 "\w" 范围,另一边是 非"\w" 的范围。

举例4:

表达式 "\bend\b" 在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";匹配到的位置是:开始于15,结束于18。

一些符号可以影响表达式内部的子表达式之间的关系

表达式

作用

|

左右两边表达式之间 "或" 关系,匹配左边或者右边

( )

(1)在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰

(2)取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到

举例5:

表达式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 时,匹配结果是:成功;匹配到的内容是:"Tom"; 匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:"Jack";匹配到的位置  时:开始于15,结束于19。

举例6:

表达式 "(go\s*)+" 在匹配 "Let's go go go!" 时,匹配结果是:成功;匹配到内容是:"go go go";匹配到的位置是:开始于6,结束于14。

举例7:

表达式 "¥(\d+.?\d*)" 在匹配 "$10.9,¥20.5" 时,匹配的结果是:成功;匹配到的内容是:"¥20.5";匹配到的位置是:开始于6,结束于10。单独获取括号范围匹配到的内容是:"20.5"。

2. 正则表达式高级用法

2.1贪婪与非贪婪

贪婪模式:

在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 "dxxxdxxxd",举例如下。

表达式

匹配结果

d\w+

"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"

d\w+d

"\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d"

由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个"d",但那也是为了让整个表达式能够匹配成功。同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。

非贪婪模式:

在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达 式匹配成功。举例如下,针对文本 "dxxxdxxxd" 举例:

表达式

匹配结果

d\w+?

"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"\w+?" 只匹配了一个 "x"

d\w+? d

为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。

因此,结果是:"\w+?" 匹配 "xxx"

2.2 反向引用\1,\2...

表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。在实际应用场合中,当用某种边界来查找,而所要 获取的内容又不包含边界时,必须使用小括号来指定所要的范围。

其实,"小括号包含的表达式所匹配到的字符串"   不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串,"\2" 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含 另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。

2.3 零宽断言

前面的章节中,我讲到了几个代表抽象意义的特殊符号:"^","$","\b"。它们都有一个共同点,那就是:它们  本身不匹配任何字符,只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件。理解到这个概念以后,本节将继续介绍另外一种对 "两头" 或者 "缝隙" 附加条件的,更加灵活的表示方法。

正向预搜索:“(?=xxxxx)”,“(?!xxxxx)”

格式:"(?=xxxxx)",在被匹配的字符串中,它对所处的 "缝隙" 或者 "两头" 附加的条件是:所在缝隙的右侧,必须能够匹配上  xxxxx  这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 "\b",本身不匹配任何字符。"\b" 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。

举例1:

表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98,Windows NT,Windows 2000"  时,将只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字样则不被匹配。 

举例2:

表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。当然,这个表达式可以不这样写,在此的目的是作  为演示之用。格式:"(?!xxxxx)",所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。 

举例3:

表达式 " ((?!\bstop\b).)+" 在匹配 "fdjka ljfdl stop fjdsla fdj" 时,将从头一直匹配到 "stop" 之前的位置,如果字符串中没有"stop",则匹配整个字符串。 

举例4:

表达式 "do(?!\w)" 在匹配字符串 "done, do, dog" 时,只能匹配 "do"。在本条举例中,"do" 后边使用 "(?!\w)" 和使用 "\b" 效果是一样的。

反向预搜索:“(?<=xxxxx)”,“(?

这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 "左侧",两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 "正向预搜索"   一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。

举例5:

表达式 "(?<=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。

2.4 其他通用规则

还有一些在各个正则表达式引擎之间比较通用的规则。

在表达式 "\s","\d","\w","\b" 表示特殊意义的同时,对应的大写字母表示相反的意义。

表达式

可匹配

\S

匹配所有非空白字符

\D

匹配所有的非数字字符

\W

匹配所有的字母、数字、下划线以外的字符

\B

匹配非单词边界,即左右两边都是 "\w" 范围或者左右两边都不是 "\w" 范围时的字符缝隙

在表达式中有特殊意义,需要添加 "" 才能匹配该字符本身的字符汇总。

字符

说明

^

匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"

$

匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "$"

( )

标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "(" 和 ")"

[ ]

用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "[" 和 "]"

{ }

修饰匹配次数的符号。要匹配大括号,请使用 "{" 和 "}"

.

匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "."

?

修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?"

+

修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "+"

*

修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "*"

|

左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "|"

3. 正则表达式引擎

3.1 常见的正则表达式引擎

引擎决定了正则表达式匹配方法及内部搜索过程,了解它至关重要的。目前主要流行引擎有:DFA,NFA两种引擎,我们比较区分下:

引擎

区别点

DFA(Deterministic finite automaton 确定型有穷自动机)

DFA引擎它们不要求回溯(并因此它们永远不测试相同的字符两次),所以匹配速度快!DFA引擎还可以匹配最长的可能的字符串。不过DFA引擎只包含有限的状态,所以它不能匹配具有反向引用的模式,还不可以捕获子表达式。代表性有:awk, egrep, flex, lex, MySQL, Procmail

NFA(Non-deterministic finite automaton) 非 确定型有穷自动机,又分为传统NFA,Posix NFA

传统的NFA引擎运行所谓的“贪婪的”匹配回溯算法(longest-leftmost),以指定顺序测试正则表达式的所有可能的扩展并接受第一个匹配项。传统的NFA回溯可以访问完全相同的状态多次,在最坏情况下,它的执行速度可能非常慢,但它支持子匹配。代表性有:GNU Emacs, Java, ergp, less, more, .NET语言,PCRE library, Perl, PHP, Python, Ruby, sed, vi等,一般高级语言都采用该模式。

DFA以字符串为主,逐个在正则表达式匹配查找,而NFA以正则表达式为主,在字符串中逐一查找。尽管速度慢,但是对操作者来说更简单,因此应用更广泛!下面所有以NFA引擎举例说明,解析过程!

3.2 正则表达式的简单匹配过程

3.2.1 解析引擎眼中的字符串组成

对于字符串“DEF”而言,包括D、E、F三个字符和 0、1、2、3 四个数字位置:0D1E2F3,对于正则表达式而言所有源字符串,都有字符和位置。正则表达式会从0号位置,逐个去匹配的。

3.2.2 占有字符和零宽度

正则表达式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的;如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度的。占有字符是互斥的,零宽度是非互斥的。也就是一个字符,同一时间只能由一个子  表达式匹配,而一个位置,却可以同时由多个零宽度的子表达式匹配。常见零宽字符有:^,(?=)等。

3.2.3 正则表达式匹配过程详解实例

例1:源字符DEF,对应标记是:0D1E2F3,匹配正则表达式是:/DEF/

过程分析

首先由正则表达式字符 /D/ 取得控制权,从位置0开始匹配,由 /D/ 来匹配“D”,匹配成功,控制权交给字符 /E/ ;由于“D”已被 /D/ 匹配,所以 /E/ 从位置1开始尝试匹配,由 /E/ 来匹配“E”,匹配成功,控制权交给 /F/ ;由 /F/来匹配“F”,匹配成功。

例2:源字符DEF,对应标记是:0D1E2F3,匹配正则表达式是:/Dw+F/

过程分析

首先由正则表达式字符 /D/ 取得控制权,从位置0开始匹配,由 /D/ 来匹配“D”,匹配成功,控制权交给字符 /\w+/ ;由于“D”已被 /D/ 匹配,所以 /\w+/ 从位置1开始尝试匹配,\w+贪婪模式,会记录一个备选状态,默认会匹配最长字符,直接匹配到EF,并且匹配成功,当前位置3了。并且把控制权交给 /F/ ;由 /F/ 匹配失败,\w+匹配会回溯一位,当前位置变成2。并把控制权交个/F/,由/F/匹配字符F成功。因此\w+这里匹配E字符,匹配完成!

例3:源字符DEF,对应标记是:0D1E2F3,匹配正则表达式是:/^(?=D)[D-F]+$/

过程分析

元字符 /^/ 和 /$/ 匹配的只是位置,顺序环视 /(?=D)/ (匹配当前位置,右边是否有字符“D”字符出现)只进行匹配,并不占有字符,也不将匹配的内容保存到最终的匹配结果,所以都是零宽度的。 首先由元字符 /^/ 取得控制权,从位置0开始匹配, /^/ 匹配的就是开始位置“位置0”,匹配成功,控制权交给顺序环视 /(?=D)/;/(?=D])/ 要求它所在位置右侧必须是字母”D”才能匹配成功,零宽度的子表达式之间是不互斥的,即同一个位置可以同时由多个零宽度子表达式匹配,所以它也是从位置0尝试进行匹配,位置0的右侧是字符“D”,符合要求,匹配成功,控制权交给 /[D-F]+/ ;因为/(?=D)/ 只进行匹配,并不将匹配到的内容保存到最后结果,并且 /(?=D)/ 匹配成功的位置是位置0,所以 /[D-F]+/也是从位置0开始尝试匹配的, /[D-F]+/ 首先尝试匹配“D”,匹配成功,继续尝试匹配,直到匹配完”EF”,这时已经匹配到位置3,位置3的右侧已没有字符,这时会把控制权交给 /$/,元字符 /$/ 从位置3开始尝试匹配,它匹配的是结束位置,也就是“位置3”,匹配成功。此时正则表达式匹配完成,报告匹配成功。匹配结果为“DEF”,开始位置为0,结束位置为3。其中 /^/ 匹配位置0, /(?=D)/ 匹配位置0, /[D-F]+/ 匹配字符串“DEF”, /$/ 匹配位置3。

4. 正则表达式生产环境实例

4.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)$

4.2 检验字符

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]+

4.3 特殊需求

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})+/.?

3. InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

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-4405222、021-87888822):\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. 钱的输入格式:

有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和"10,000":^[1-9][0-9]*$,这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$,一个0或者一个不以0开头的数字。我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$,这表示一个0或者一个可能为负的开头不为0的数字。让用户以0开头好了。把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$,必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$,这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$,这样就允许用户只写一位小数。下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$,1到3个数字,后面跟着任意个逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$。备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里

16. xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$

17. 中文字符的正则表达式:[\u4e00-\u9fa5]

18. 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))

19. 空白行的正则表达式:\n\s*\r (可以用来删除空白行)

20. HTML标记的正则表达式:]*>.*?\1>|<.> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)

21. 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)

22. 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)

23. 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)

24. IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)

25. IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

26. 银行卡号: /^([1-9]{1})(\d{14}|\d{18})$/

——END——

 保offer班 

4b8690f714f8afddba5e3a16485766f6.png

a43c2ec0d4f758cd48ec06179b75162f.png

223ba72c7c81809a01c3a8574f88d9f1.png

7cd36a2c5237c9954f9b51b8b41de865.png

ebe01ebc4799836593a22129be1181bd.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值