正则表达式?(正则表达式语法)
本篇文章给大家谈谈正则表达式?,以及正则表达式语法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
正则表达式是什么?
问题一:什么是正则表达式 如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,它们并不是您想象的那么新奇。
请回想一下在硬盘上是如何查找文件的。您肯定会使用 ? 和 * 字符来帮助查找您正寻找的文件。? 字符匹配文件名中的单个字符,而 * 则匹配一个或多个字符。一个如 'data?.dat' 的模式可以找到下述文件:
data1.dat
data2.dat
datax.dat
dataN.dat
如果使用 * 字符代替 ? 字符,则将扩大找到的文件数量。'data*.dat' 可以匹配下述所有文件名:
data.dat
data1.dat
data2.dat
data12.dat
datax.dat
dataXYZ.dat
尽管这种搜索文件的方法肯定很有用,但也十分有限。? 和 * 通配符的有限能力可以使骸对正则表达式能做什么有一个概念,不过正则表达式的功能更强大,也消型更灵活。
问题二世喊:正则表达式是什么?有什么用? 简单的说就是,用一小段简单的各种字符的组合,即叫做 正则表达式,去实现复杂的:
字符串匹配,查找你到你所需要的内容,以便后期提取出来你所要的内容。
这个听起来很简单,但是很多现实的应用中,所要处理的字符串有千千万万种,各种复杂的字符,而且每个人的需求有无穷尽种,需要提取出的内容也是无穷多。而如果手动处理,写普通的if else语句去一点点判断字符串是否相等,则是无法实现的。
而用正则,就可以实现如此多的,繁杂的,极度复杂的,各种需求。
更多的内容,可以看看我所总结的:
正则表达式学习心得
再举几个实际的例子:
Notepad++正则表达式替换举例1:一次性替换多个文件的后缀
Notepad++正则表达式替换举例2:一次性替换多个路径
Notepad++正则表达式替换举例3:一次性替换多个listitem为sect4
Notepad++正则表达式替换举例4:给每一行都添加AddIcon的前缀
Notepad++正则表达式替换举例5:给book的标题和地址添加html代厂
(这里不给贴地址,请自行google搜标题,即可找到帖子地址)
问题三:正则表达式中的*是什么意思 *是一个限定符,用来修饰前一个字符或分组,限定匹配重复的数量为任意数量。
例如:
正则表达式 a* 可以匹配 a aa aaa aaaa aaaaaaa等等
正则表达式 (ab)* 可以匹配 ab abababab ababababababab等等
需要注意个是,*与+不同,+要求重复数量至少为1,*则可以为0,所以字符串为空也是可以匹配的。
以下是常用的限定符代码:
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
望采纳!
问题四:这个正则表达式是什么意思 ^是界定符,表示匹配字符串的开始;
[+-],中括号表示其内的内容都是符合要求的匹配,所以这个表示“+”或者-;
\d,[0-9]的简写形式,也就是匹配数字;
$也是界定符,表示匹配字符串的结束;
了解以上之后再来看问号(?)和星号(*):跟在一个模式内容后面的是量词,用来限定模式内容匹配的次数,例如我想要匹配最少1个、最多3个数字,例如4、20、123、226这样的,先前已经解释过单个数字可以用[0-9]或者\d表示,那么怎么表示最少匹配1次、最多3次呢?很简单,拿返猜就在模式后面加上大括号配合次数表示量词,形式为{下限,上限},就是这样[0-9]{1,3}或者\d{1,3}。类似的,[0-9]{2}就表示只能匹配2个数字(多一个少一个都不行),[0-9]{2,}表示至少要有2个数字最多不限(注意大括号内的逗号),[0-9]{,2}表示最多有2个数字(注意大括号的逗号)。
针对经常用的量词,正则中也有简写,{0,1}简写就是问号(要么没有要么只有一次),{0,}简写就是星号(随便有没有也不限次数),{1,}简写就是加号(至少有一次)
问题五:正则表达式中 .*? 代表什么? 点 是任意字符
* 是取 0 至 无限长度
问号 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?a
就是取前面任意长度的字符,到底一个 a 出现,匹配如下
[email protected] _qwerqweraljlkjlkjlkj
得到:[email protected] _qwerqwera 这部分,如果匹配不到后面的 a 字符,则匹配为空。
问题六:正则表达式.*?是什么意思? .匹配任意字符1个
*表示匹配重复上一个字符0到无限次
?表示匹配前一个字符0次或一次,跟在*表示非贪婪模式
默认是贪婪模式比如
会把所有字符吞下满足前面是就返回字符串
一次吃一个字符满足条件返回字符串
问题七:简单说下什么是正则表达式 简单地说就是一种格式化的匹配方式,与普通的查找方式相比,可以用一句话匹配出所有格式统一或类似的子串,而不用逐一列出每一种可能的情况,可以大幅降低程序的复杂度,提高程序的可靠性,减少处理遗漏。
问题八:正则表达式中“@”的作用是什么? C#中的字符串,如正则表达式中,有可能出现一些与C#语言相同的字符,比如\,会让编译器作为C#语言来识别,截断该字符串,并可能产生编译器错误.
为了防止这种情况的发生,在该字符串前加一个@就是告诉编译器,这些特殊字符是作为字符串中的一部分存在的,编译器就不会去编译它了.
比如路径c:\abc\d.txt将产生编译器错误,之前可以[email protected] :\abc\d.txt便得到其真实路径了.
这下明白了吧?
问题九:正则表达式的[],(),{}都指的是什么含义,有什么区别? [asd]或是[0-9a-zA-Z]
第一个表示匹配asd三个字母中任意一个字符,第一个表示匹配0-9,a-z大小写中的任意一个字符
()表示一个整体吧,比如asdf你想匹配他或是空,asdf?是错误的,问号只能匹配f的存在 ,而是使用(asdf)?,另外在一些替换中可用一些符号表示括号中匹配的内容,比如
/^$/
\1就代表(\w+)中匹配到的内容,这个正则可以匹配 ,开始和结束相同的标签
其他作用这一下也没想起了。。
{}代码匹配内容的数量如/^a{1,4}$/表示最少有一个a,最多4个a,或是/^a{2, }$/表示最少要有两个a,没上限的
问题十:.*([';]+|(--)+).* 正则表达式是什么意思 .*([';]+|(--)+).*
任意字符 ';这两个字符至少处一个,且最少一次
或者 --至少出现一次,或者多次出现 再任意字符
比如
任意字符''''''--任意字符
任意字符;;;;;;--任意字符
任意字符''''''----任意字符
任意字符''----任意字符
任意字符;----任意字符
[img]正则表达式
首先我们要了解正则表达式是什么,它是一种匹配模式, 不仅能匹配匹配字符,还能匹配位置 ,不少人忽略了匹配字符这个作用,往往碰到这种问题就手足无措。
如果正则只有精确匹配是没有多大意义的,比如:
正则表达埋漏式的强大之处在于它的模糊匹配,分为横向模糊和纵向模糊
横向模糊:一个正则可匹配的字符串的长度不是固定的,可以是多种情况的
其实现的方式是使用量词:
比如:
横向模糊匹配到了多种情况,案例中用的正则是/ab{2,5}c/g,后面多了g,它是正则的一个修饰符。表示全局匹配,即在目标字符串中按顺序找到满足匹配模式的所有子串,强调的是“所有”,而不只是“第一个”。
纵向模糊:一个正则匹配的字符串,具体到某一位字符时,运冲它可以不是某个确定的字符,可以有多种可能
其实现的方式是使用范围类
-表示连字符,在此处作特殊用处,但是如果我要匹配'a-z'这三个字符呢?可以这么写:
这样引擎就不会认为它们是一个氛围了, 符号在范围类中起取反的作用, a表示除了a的所有字符。
系统根据范围类又预定义了一些类方便我们使用:
不加g就是惰性匹配,我匹配完一个就不敢了,懒得再干其他事儿了,加了g就是贪婪模式了,我现在精力无限,会尽可能的干事儿,但是我还有些理智,不会干超出能力之外的事儿,比如你给我的范围是{2,5},我会尽可旁液歼能做5件事儿,但是不会超过5件事,反正只要在能力范围内,越多越好
此时我既想尽可能的匹配又想让它不那么贪婪有没有办法呢?办法是有的, 贪婪模式一般作用在量词这里,限制在量词这里就好了 ,可以在量词这里加一个?即可搞定。
其中/\d{2,5}?/表示,虽然2到5次都行,当2个就够的时候,就不在往下尝试了。
此时就达到了我们的要求,不过这里完全是为了讲解贪婪模式和惰性模式,并不推荐这么做,我完全可以将{2,5}改成{2},一样的效果
知道了惰性模式的原理,我们完全可以鼓捣出其他的各式各样的情形:
一个模式可以实现横向和纵向模糊匹配。而多选分支可以支持多个子模式任选其一
具体形式如下:(p1|p2|p3),其中p1、p2和p3是子模式,用“|”(管道符)分隔,表示其中任何之一
但有个事实我们应该注意,比如我用/good|goodbye/,去匹配"goodbye"字符串时,结果是"good"
而把正则改成/goodbye|good/,结果是
也就是说,分支结构也是惰性的,即当前面的分支匹配上了,后面的就不再尝试了
并且,使用分支的时候注意使用括号,
匹配字符,无非就是范围类、量词和分支结构的组合使用罢了
分析:
表示一个16进制字符,可以用范围类[0-9a-fA-F]
其中字符可以出现3或6次,需要是用量词和分支结构
使用分支结构时,需要注意顺序(惰性)
分析:
对每个地方的数字进行分析:
共4位数字,第一位数字可以为[0-2]。
当第1位为2时,第2位可以为[0-3],其他情况时,第2位为[0-9]。
第3位数字为[0-5],第4位为[0-9]
如果也要求匹配7:9,也就是说时分前面的0可以省略:
分析:
年,四位数字即可,可用[0-9]{4}。
月,共12个月,分两种情况01、02、……、09和10、11、12,可用(0[1-9]|1[0-2])。
日,最大31天,可用(0[1-9]|[12][0-9]|3[01])
分析:
整体模式是: 盘符:\文件夹\文件夹\文件夹
其中匹配F:\,需要使用[a-zA-Z]:\,其中盘符不区分大小写,注意\字符需要转义。
文件名或者文件夹名,不能包含一些特殊字符,此时我们需要排除范围类[ \:*|"?\r\n/]来表示合法字符。另外不能为空名,至少有一个字符,也就是要使用量词+。因此匹配“文件夹\”,可用[ \:*|"?\r\n/]+\。
另外“文件夹\”,可以出现任意次。也就是([^\: |"?\r\n/]+\) 。其中括号提供子表达式。
路径的最后一部分可以是“文件夹”,没有\,因此需要添加([^\:*|"?\r\n/]+)?。
最后拼接成了一个看起来比较复杂的正则:
用到了惰性匹配,防止把class也提取出来
优化:
^(脱字符)匹配开头,在多行匹配中匹配行开头。
$(美元符号)匹配结尾,在多行匹配中匹配行结尾
比如我们把字符串的开头和结尾用"#"替换(位置可以替换成字符的!):
多行匹配模式时,二者是行的概念,这个需要我们的注意
\b是单词边界,具体就是\w和\W之间的位置,也包括\w和^之间的位置,也包括\w和$之间的位置
首先,我们知道,\w是范围类[0-9a-zA-Z_]的简写形式,即\w是字母数字或者下划线的中任何一个字符。而\W是排除范围类[^0-9a-zA-Z_]的简写形式,即\W是\w以外的任何一个字符
此时我们可以看看"[#JS#] #Lesson_01#.#mp4#"中的每一个"#",是怎么来的。
第一个"#",两边是"["与"J",是\W和\w之间的位置。
第二个"#",两边是"S"与"]",也就是\w和\W之间的位置。
第三个"#",两边是空格与"L",也就是\W和\w之间的位置。
第四个"#",两边是"1"与".",也就是\w和\W之间的位置。
第五个"#",两边是"."与"m",也就是\W和\w之间的位置。
第六个"#",其对应的位置是结尾,但其前面的字符"4"是\w,即\w和$之间的位置。
知道了\b的概念后,那么\B也就相对好理解了。
\B就是\b的反面的意思,非单词边界。例如在字符串中所有位置中,扣掉\b,剩下的都是\B的。
具体说来就是\w与\w、\W与\W、^与\W,\W与$之间的位置
exp1(?=exp2) 表达式会匹配exp1表达式,但只有其后面内容是exp2的时候才会匹配
exp1(?=exp2) 表达式会匹配exp1表达式,但只有其后面内容不是exp2的时候才会匹配
(?=p),其中p是一个子模式,即p前面的位置
比如(?=l),表示'l'字符前面的位置,例如:
而(?!p)就是(?=p)的反面意思
对于位置的理解,我们可以理解成空字符""
因此,把/ hello$/写成/ ^hello$$$/,是没有任何问题的:
也就是说字符之间的位置,可以写成多个。
把位置理解空字符,是对位置非常有效的理解方式
此正则要求只有一个字符,但该字符后面是开头。
比如把"12345678",变成"12,345,678"。
可见是需要把相应的位置替换成","
使用(?=\d{3}$)就可以做到:
因为逗号出现的位置,要求后面3个数字一组,也就是\d{3}至少出现一次。
此时可以使用量词+:
此时会出现问题:
上面的正则,仅仅表示把从结尾向前数,一但是3的倍数,就把其前面的位置替换成逗号
怎么解决呢?我们要求匹配的到这个位置不能是开头。
我们知道匹配开头可以使用^,但要求这个位置不是开头怎么办?
easy,(?!^)
如果要把"12345678 123456789"替换成"12,345,678 123,456,789"。
此时我们需要修改正则,把里面的开头^和结尾$,替换成\b
其中(?!\b)怎么理解呢?
要求当前是一个位置,但不是\b前面的位置,其实(?!\b)说的就是\B。
因此最终正则变成了:/\B(?=(\d{3})+\b)/g
此题,如果写成多个正则来判断,比较容易。但要写成一个正则就比较困难。
那么,我们就来挑战一下。看看我们对位置的理解是否深刻
我们可以把原题变成下列几种情况之一:
1.同时包含数字和小写字母
2.同时包含数字和大写字母
3.同时包含小写字母和大写字母
4.同时包含数字、小写字母和大写字母
上面的正则看起来比较复杂,只要理解了第二步,其余就全部理解了。
/(?=.*[0-9])^[0-9A-Za-z]{6,12}$/
对于这个正则,我们只需要弄明白(?=.*[0-9])^即可。
分开来看就是(?=.*[0-9])和^。
表示开头前面还有个位置(当然也是开头,即同一个位置,想想之前的空字符类比)。
(?=. [0-9])表示该位置后面的字符匹配. [0-9],即,有任何多个任意字符,后面再跟个数字。
另一种解法:
“至少包含两种字符”的意思就是说,不能全部都是数字,也不能全部都是小写字母,也不能全部都是大写字母。
那么要求“不能全部都是数字”,怎么做呢?(?!p)出马!
三种'都不能'呢?
1.分组和分支结构
括号是提供分组功能,使量词'+'作用于z和这个整体
而在多选分支结构(p1|p2)中,此处括号的作用也是不言而喻的,提供了子表达式的所有可能
而要使用它带来的好处,必须配合使用实现环境的API
以日期为例。假设格式是yyyy-mm-dd的
提取数据:
match返回的一个数组,第一个元素是整体匹配结果,然后是各个分组(括号里)匹配的内容,然后是匹配下标,最后是输入的文本
可以使用正则对象的exec方法:
也可以使用构造函数的全局属性$1至$9来获取:
替换:
想把yyyy-mm-dd格式,替换成mm/dd/yyyy怎么做?
反向引用:
比如要写一个正则支持匹配如下三种格式:
注意里面的\1,表示的引用之前的那个分组(-|/|.)。不管它匹配到什么(比如-),\1都匹配那个同样的具体某个字符
括号嵌套怎么办?
以左括号(开括号)为准
\10是表示第10个分组,还是\1和0呢?答案是前者,虽然一个正则里出现\10比较罕见
引用不存在的分组会怎样?
因为反向引用,是引用前面的分组,但我们在正则里引用了不存在的分组时,此时正则不会报错,只是匹配反向引用的字符本身。例如\2,就匹配"\2"。注意"\2"表示对2进行了转意
非捕获分组:
之前文中出现的分组,都会捕获它们匹配到的数据,以便后续引用,因此也称他们是捕获型分组。
如果只想要括号最原始的功能,但不会引用它,即,既不在API里引用,也不在正则里反向引用。此时可以使用非捕获分组(?:p)
第二种,匹配整个字符串,然后用引用来提取出相应的数据
思路是找到每个单词的首字母,当然这里不使用非捕获匹配也是可以的
首字母不会转化为大写的。其中分组(.)表示首字母,单词的界定,前面的字符可以是多个连字符、下划线以及空白符。正则后面的?的目的,是为了应对str尾部的字符可能不是单词字符,比如str是'-moz-transform '
通过key获取相应的分组引用,然后作为对象的键
匹配一个开标签,可以使用正则[^]+,
匹配一个闭标签,可以使用/[^]+,
但是要求匹配成对标签,那就需要使用反向引用
其中开标签[ ]+改成([ ]+),使用括号的目的是为了后面使用反向引用,而提供分组。闭标签使用了反向引用,/\1。
另外[\d\D]的意思是,这个字符是数字或者不是数字,因此,也就是匹配任意字符的意思
而当目标字符串是"abbbc"时,就没有所谓的“回溯”。其匹配过程是:
其中子表达式b{1,3}表示“b”字符连续出现1到3次。
图中第5步有红颜色,表示匹配不成功。此时b{1,3}已经匹配到了2个字符“b”,准备尝试第三个时,结果发现接下来的字符是“c”。那么就认为b{1,3}就已经匹配完毕。然后状态又回到之前的状态(即第6步,与第4步一样),最后再用子表达式c,去匹配字符“c”。当然,此时整个表达式匹配成功了。
图中的第6步,就是“回溯”。
你可能对此没有感觉,这里我们再举一个例子。正则是:
目标字符串是"abbbc",匹配过程是:
其中第7步和第10步是回溯。第7步与第4步一样,此时b{1,3}匹配了两个"b",而第10步与第3步一样,此时b{1,3}只匹配了一个"b",这也是b{1,3}的最终匹配结果。
这里再看一个清晰的回溯,正则是:
目标字符串是:"acd"ef,匹配过程是:
图中省略了尝试匹配双引号失败的过程。可以看出“.*”是非常影响效率的。
为了减少一些不必要的回溯,可以把正则修改为/"[^"]*"/。
正则表达式匹配字符串的这种方式,有个学名,叫回溯法。
回溯法也称试探法,它的基本思想是: 从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。这种不断“前进”、不断“回溯”寻找解的方法,就称作“回溯法” 。
本质上就是深度优先搜索算法。其中 退到之前的某一步这一过程,我们称为“回溯” 。从上面的描述过程中,可以看出,路走不通时,就会发生“回溯”。即, 尝试匹配失败时,接下来的一步通常就是回溯
道理,我们是懂了。那么JS中正则表达式会产生回溯的地方都有哪些呢?
3.1 贪婪量词
之前的例子都是贪婪量词相关的。比如b{1,3},因为其是贪婪的,尝试可能的顺序是从多往少的方向去尝试。首先会尝试"bbb",然后再看整个正则是否能匹配。不能匹配时,吐出一个"b",即在"bb"的基础上,再继续尝试。如果还不行,再吐出一个,再试。如果还不行呢?只能说明匹配失败了。
虽然局部匹配是贪婪的,但也要满足整体能正确匹配。否则,皮之不存,毛将焉附?
此时我们不禁会问,如果当多个贪婪量词挨着存在,并相互有冲突时,此时会是怎样?
答案是,先下手为强!因为深度优先搜索。测试如下:
其中,前面的\d{1,3}匹配的是"123",后面的\d{1,3}匹配的是"45"。
3.2 惰性量词
惰性量词就是在贪婪量词后面加个问号。表示尽可能少的匹配,比如:
其中\d{1,3}?只匹配到一个字符"1",而后面的\d{1,3}匹配了"234"。
虽然惰性量词不贪,但也会有回溯的现象。比如正则是:
目标字符串是"12345",匹配过程是:
知道你不贪、很知足,但是为了整体匹配成,没办法,也只能给你多塞点了。因此最后\d{1,3}?匹配的字符是"12",是两个数字,而不是一个。
3.3 分支结构
我们知道分支也是惰性的,比如/can|candy/,去匹配字符串"candy",得到的结果是"can",因为分支会一个一个尝试,如果前面的满足了,后面就不会再试验了。
分支结构,可能前面的子模式会形成了局部匹配,如果接下来表达式整体不匹配时,仍会继续尝试剩下的分支。这种尝试也可以看成一种回溯。
比如正则:
目标字符串是"candy",匹配过程:
上面第5步,虽然没有回到之前的状态,但仍然回到了分支结构,尝试下一种可能。所以,可以认为它是一种回溯的
简单总结就是,正因为有多种可能,所以要一个一个试。直到,要么到某一步时,整体匹配成功了;要么最后都试完后,发现整体匹配不成功。
既然有回溯的过程,那么匹配效率肯定低一些。相对谁呢?相对那些DFA引擎。
而JS的正则引擎是NFA,NFA是“非确定型有限自动机”的简写。
大部分语言中的正则都是NFA,为啥它这么流行呢?
答:你别看我匹配慢,但是我编译快啊,而且我还有趣哦。
而在正则表达式中,操作符都体现在结构中,即由特殊字符和普通字符所代表的一个个特殊整体。
JS正则表达式中,都有哪些结构呢?
其中涉及到的操作符有:
上面操作符的优先级从上至下,由高到低。
这里,我们来分析一个正则:
因为是要匹配整个字符串,我们经常会在正则前后中加上锚字符^和$。
比如要匹配目标字符串"abc"或者"bcd"时,如果一不小心,就会写成/^abc|bcd$/。
而位置字符和字符序列优先级要比竖杠高,故其匹配的结构是:
应该修改成:
2.2 量词连缀问题
假设,要匹配这样的字符串:
此时正则不能想当然地写成/^[abc]{3}+$/,这样会报错,说“+”前面没什么可重复的:
此时要修改成:
2.3 元字符转义问题
所谓元字符,就是正则中有特殊含义的字符。
所有结构里,用到的元字符总结如下:
当匹配上面的字符本身时,可以一律转义:
在string中,也可以把每个字符转义,当然,转义后的结果仍是本身:
现在的问题是,是不是每个字符都需要转义呢?否,看情况。
2.3.1 范围类中的元字符
跟范围类相关的元字符有 []、^、- 。因此在会引起歧义的地方进行转义。例如开头的^必须转义,不然会把整个范围类,看成反义范围类。
2.3.2 匹配“[abc]”和“{3,5}”
我们知道[abc],是个字符组。如果要匹配字符串"[abc]"时,该怎么办?
可以写成/[abc]/,也可以写成/[abc]/,测试如下:
只需要在第一个方括号转义即可,因为后面的方括号构不成字符组,正则不会引发歧义,自然不需要转义。
同理,要匹配字符串"{3,5}",只需要把正则写成/{3,5}/即可。
另外,我们知道量词有简写形式{m,},却没有{,n}的情况。虽然后者不构成量词的形式,但此时并不会报错。当然,匹配的字符串也是"{,n}",测试如下:
var str = "{,3}";
var reg = /{,3}/g;
console.log( str.match(reg)[0] );
// = "{,3}"
2.3.3 其余情况
比如= ! : - ,等符号,只要不在特殊结构中,也不需要转义。
但是,括号需要前后都转义的,如/(123)/。
至于剩下的^ $ . * + ? | \ /等字符,只要不在字符组内,都需要转义的。
因为竖杠“|”,的优先级最低,所以正则分成了两部分\d{15}和\d{17}[\dxX]。
\d{15}表示15位连续数字。
\d{17}[\dxX]表示17位连续数字,最后一位可以是数字可以大小写字母"x"。
可视化如下:
3.2 IPV4地址
正则表达式是:
这个正则,看起来非常吓人。但是熟悉优先级后,会立马得出如下的结构:
((...)\.){3}(...)
上面的两个(...)是一样的结构。表示匹配的是3位数字。因此整个结构是
3位数.3位数.3位数.3位数
然后再来分析(...):
(0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])
它是一个多选结构,分成5个部分:
0{0,2}\d ,匹配一位数,包括0补齐的。比如,9、09、009;
0?\d{2} ,匹配两位数,包括0补齐的,也包括一位数;
1\d{2} ,匹配100到199;
2[0-4]\d ,匹配200-249;
25[0-5] ,匹配250-255。
最后来看一下其可视化形式:
掌握正则表达式中的优先级后,再看任何正则应该都有信心分析下去了。
至于例子,不一而足,没有写太多。
这里稍微总结一下,竖杠的优先级最低,即最后运算。
只要知道这一点,就能读懂大部分正则。
另外关于元字符转义问题,当自己不确定与否时,尽管去转义,总之是不会错的。
本文就解决该问题,内容包括:
2.1 是否能使用正则
正则太强大了,以至于我们随便遇到一个操作字符串问题时,都会下意识地去想,用正则该怎么做。但我们始终要提醒自己,正则虽然强大,但不是万能的,很多看似很简单的事情,还是做不到的。
比如匹配这样的字符串:1010010001....
虽然很有规律,但是只靠正则就是无能为力。
2.2 是否有必要使用正则
要认识到正则的局限,不要去研究根本无法完成的任务。同时,也不能走入另一个极端:无所不用正则。能用字符串API解决的简单问题,就不该正则出马。
比如,从日期中提取出年月日,虽然可以使用正则:
其实,可以使用字符串的split方法来做,即可:
比如,判断是否有问号,虽然可以使用:
其实,可以使用字符串的indexOf方法:
比如获取子串,虽然可以使用正则:
其实,可以直接使用字符串的substring或substr方法来做:
var str = "JavaScript";
console.log( str.substring(4) );
// = Script
2.3 是否有必要构建一个复杂的正则
比如密码匹配问题,要求密码长度6-12位,由数字、小写字符和大写字母组成,但必须至少包括2种字符。
在匹配位置那篇文章里,我们写出了正则是:
其实可以使用多个小正则来做:
所谓准确性,就是能匹配预期的目标,并且不匹配非预期的目标。
这里提到了“预期”二字,那么我们就需要知道目标的组成规则。
不然没法界定什么样的目标字符串是符合预期的,什么样的又不是符合预期的。
下面将举例说明,当目标字符串构成比较复杂时,该如何构建正则,并考虑到哪些平衡。
3.1 匹配固定电话
比如要匹配如下格式的固定电话号码:
055188888888 0551-88888888 (0551)88888888
第一步,了解各部分的模式规则。
上面的电话,总体上分为区号和号码两部分(不考虑分机号和+86的情形)。
区号是0开头的3到4位数字,对应的正则是:0\d{2,3}
号码是非0开头的7到8位数字,对应的正则是:[1-9]\d{6,7}
因此,匹配055188888888的正则是:/^0\d{2,3}[1-9]\d{6,7}$/
匹配0551-88888888的正则是:/^0\d{2,3}-[1-9]\d{6,7}$/
匹配(0551)88888888的正则是:/^(0\d{2,3})[1-9]\d{6,7}$/
第二步,明确形式关系。
这三者情形是或的关系,可以构建分支:
提取公共部分:
进一步简写:
上面的正则构建过程略显罗嗦,但是这样做,能保证正则是准确的。
上述三种情形是或的关系,这一点很重要,不然很容易按字符是否出现的情形把正则写成:
/^(?0\d{2,3})?-?[1-9]\d{6,7}$/
虽然也能匹配上述目标字符串,但也会匹配(0551-88888888这样的字符串。当然,这不是我们想要的。
其实这个正则也不是完美的,因为现实中,并不是每个3位数和4位数都是一个真实的区号。
这就
正则表达式大全
一、校验数字的表达式
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})+/.?
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. 钱的输入格式:
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))
原文:
关于正则表达式?和正则表达式语法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。