一起进入正则表达式的世界(2)

时间:2014-03-17 13:40    点击:

有些重要的元字符还是要讲下 比如\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]/))

来源:幻想编程//所属分类:JavaScript/更新时间:2014-03-17 13:40
顶一下
(0)
0%
踩一下
(0)
0%
上一篇:一起进入正则表达式的世界(1)
下一篇:一起进入正则表达式的世界(3)
相关内容