一起进入正则表达式的世界(2)
有些重要的元字符还是要讲下 比如\b 匹配字符边界
if(a.match(/er\b/)) 可以匹配never veer,等后面结尾是 er的字符串
像erte,aerwo都不能匹配
如果换个位置if(a.match(/\ber/)) 则匹配字符串开头是er的字符串
\B 这个是匹配非字符边界
if(a.match(/\Ber/)) 匹配字符串开头不是er的字符串,且字符串要包含er
1er,hero,terer都能匹配,
if(a.match(/er\B/)) 匹配字符串结尾不是er的字符串,且字符串要包含er
erl,oerk,ererm都能匹配
现在说说正则表达式的特殊符号 ^ 这个在[]里见过了,表示非,但在括号外,它是另一种意思,表示匹配输入字符串开始的位置
if(a.match(/^x/)) 只要开头是x的字符串就pass,其实就跟这个是一样的if (a.match(/\bx/))
然后是$美元符号,它表示匹配输入字符串结尾的位置
if(a.match(/x$/)) 只要结尾是x的字符串就pass,和if(a.match(/x\b/)) 一样
前面说过if(a.match(/a/)) 只要字符串包含a就能pass
但如果我就只让它就一个字符a才能pass,怎么办呢?(注意下,前面所有的题目都只是包含就可匹配)
这时候^和$就派上用场啦
if(a.match(/^a$/)) 表示只匹配字符串开始和结尾中间的部分
只能匹配a,像a123,aaa,abc都无法匹配
if(a.match(/^hello$/)) 只有字符串是hello才能匹配
if(a.match(/^[a-z]$/)) 这样只能匹配a-z之间的一个字符
if(a.match(/^[0-9]$/)) 这样只能匹配0-9之间的一个数字
if(a.match(/^[^0-9]$/)) 这样表示只能匹配非0-9的一个字符(比如一个字母或一个符号)
前面大家有见过中括号[],现在说说大括号{}
{n} n必须为正整数 先看下面
if(a.match(/^x{1}$/)) 这表示字符串必须只能出现1个x字符才能正确匹配,多了少了都不行,必须只有一个x
if(a.match(/^x{0}$/)) 这样只能匹配空值,所以绝对不要让n为0
if(a.match(/^x{2}$/)) 字符串必须有2个x才能匹配
zxx能匹配,xxx,1x,xaxzx都不能匹配
要是加个逗号呢 if(a.match(/^x{1,}$/)) 表示你只要给我至少出现一次x就可匹配
就跟if(a.match(/x/)) 一样了
if(a.match(/^x{2,}$/)) 至少出现两次 xxy,xxxxxxk,yyxxx,xyxy都能匹配
再看下面
{n,m} n <= m m绝对不能小于n
if(a.match(/^x{1,3}$/)) 表示x至少要出现一次且不能超过3次
x,xx,xxx,123xx都能匹配 xxxx就不能匹配了
如果这样呢
if(a.match(/^x{3,3}$/))
就跟 if(a.match(/^x{3}$/)) 一样了,表示x只能必须出现3次
还有一个地方你要注意,如果你不用^$包含起来
{n},{n,}{n,m} 3个效果基本没区别,因为都变成了只包含就可匹配
下面说说* 这个符号,这个一般叫做通配符,查找文件一般大家用过的,比如 *.jpg
查找所有后缀为jpg的图片
在正则表达式里 *表示零次或多次匹配前面的字符或子表达式 * 等效于 {0,}
if(a.match(/^x*$/)) 表示字符串要么空值要么每个字符都要是x才能匹配
空值,x,xx,xxx,xxxx能匹配 1x,xx1,xxx123都不能匹配
if(a.match(/^xx*$/)) 至少有个x才能匹配
现在还迷迷糊糊的
下面的应该容易理解
if(a.match(/^zo*$/)) 能匹配z,zo,zoo,zooooo,但不能匹配,o,oz,zzzzz,ooooo
让我们来分析一下
首先^ 表示字符串开始 字符串开头要z开头是必须滴。
然后遇到o*,这里千万不要以为*前面跟2个字符,*前面只能跟一个字符
遇到了o* 它就告诉你,如果你想继续往下输入字符串,就必须跟我前面的o一样,我管你的o出现一次或多次,反正我后面是 $号了,你再往下输入数字串就只能全是是o了,当然,你可以选择放弃不继续输入了,那么,一个z也算你pass
提示:遇到*号你可以选择跳过它 因为*表示零次或多次匹配前面的字符
那么看下面if(a.match(/^zo*k$/))
首先z必须开头滴,然后遇到o* ,这时候你就可以选择跳过它还是通过它
跳过它那么遇到k,zk一起就可以pass了
如果想通过它,就必须按它的规则,出现一次或多次o,这个随便你所以zk,zok,zoook,zoooooook 都能pass
zo,zokko,zooooobk 不能pass
现在说 +号
正则表达式里,+号表示一次或多次匹配前面的字符或子表达式,+ 等效于 {1,}
if(a.match(/^x+$/)) 必须至少只能要有个x 跟 if(a.match(/^x{1,}$/))是一样的
x,xx,xxx,xxxx能匹配 1x,xx1,xxx123都不能匹配
跟*不同,你无法选择跳过,必须通过它,因为它表示一次或多次匹配前面的字符
if(a.match(/^zo+k$/))
z开头必须滴
遇到o+ 这时候你躲不过了,只能按它的规则继续,至少出现一次o就行啦
所以zok zook,zoooook能够pass
zk,zko,zzookkk不能pass
现在再说?号
正则表达式里,?号表示零次或一次匹配前面的字符或子表达式
if(a.match(/^x?$/)) 表示只匹配空值,或者一个x字符
?和*一样可以选择跳过
如果想通过,?要求你了出现次数,出现一次就好,别多,多了就不让你pass了
if(a.match(/^zo?k$/))
只能匹配zk,zok,不能匹配zook,zooook
if(a.match(/^z(ok)*k$/)) 如果这样 *前面就跟ok了
如果通过想匹配它,必须是ok的倍数 okokok okokokokok 不能okoko 少了k
或者是kokokoko改变顺序都不行
能匹配的:zk,zokk,zokokk,zokokokk
if(a.match(/^z(ok)+k$/))
if(a.match(/^z(ok)?k$/))
就不用再说了吧
下面在说说?的其他用法
当此?字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。 “非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串“oooo”中,“o+?”只 匹配单个“o”,而“o+”匹配所有“o”。
这个并不是if(a.match(/x+?/)) 就只能匹配一个x了
这样说把if(a.match(/x+/)) 要求你至少有一个x就pass
但你输入了xxxxx5个x 程序就会把xxxxx拿来直接匹配一次
你输入一万个x,它也会把这一万个x拿来匹配一次,看看是否和条件
而if(a.match(/x+?/)) 它发现你第一个字符有x了,已经符合它的最低要求了,它就不会再去匹配别的x了
当你要去匹配很长长的字符串的时候,if(a.match(/x+/))会挨个挨个的匹配
而if(a.match(/x+?/)) 只要发现一段字符串已经符合最低条件,它就不会在去匹配多余字符了
这个跟效率有关,以后会用到的
大家可以拿来对比下
<input id="a" type="text" />
<input type="button" onclick='regexp(document.getElementById("a").value)' value="Test"/> <script>
function regexp(a)
{
if(a.match(/x+/))
alert(a.match(/x+/));
else
alert("No Pass"); }
</script>
你输入多少x就打印弹出多少x
<input id="a" type="text" />
<input type="button" onclick='regexp(document.getElementById("a").value)' value="Test"/> <script>
function regexp(a)
{
if(a.match(/x+?/))
alert(a.match(/x+?/));
else
alert("No Pass"); }
</script>
只弹一个x
还有数字的匹配也可以试试
<input id="a" type="text" />
<input type="button" onclick='regexp(document.getElementById("a").value)' value="Test"/> <script>
function regexp(a)
{
if(a.match(/\d{1,}?/))
alert(a.match(/\d{1,}?/));
else
alert("No Pass"); }
</script>
下面说说.号,这个非常容易理解
它能匹配除“\n”(换行符)之外的任何单个字符。
比如if(a.match(/^a.c$/)) 它能匹配a.c,abc,acc a+c,a-c等等
还有一个符号| 或
注意正则表达式就没有 &与了
if(a.match(/x|y/)) 可匹配字符串包含x或者y的字符串
比如xkk,ykk,xykk,xy,x,y
如果要同时存在呢
if(a.match(/xy/)) 就这么简单
如果要同时存在,且不需要挨在一起呢
if(a.match(/x.y/))
如果不要xy的存在呢
if(a.match(/[^xy]/))
最新内容
热点内容
- QQ群
- 返回首页
- 返回顶部