一、正则表达式中的量词
贪婪量词:
先看整个字符串是不是一个匹配。如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么再次去掉最后一个字符串,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符。简单量词都是贪婪量词。
惰性量词:
先看字符串中的第一个字母是不是一个匹配,如果单独着一个字符还不够,就读入下一个字符,组成两个字符的字符串。如果还没有发现匹配,惰性量词继续从字符串中添加字符直到发现一个匹配或者整个字符串都检查过也没有匹配。惰性量词和贪婪量词的工作方式恰好相反。
支配量词:
只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。
贪婪 |
惰性 |
支配 |
描述 |
? |
?? |
?+ |
零次或一次出现 |
* |
*? |
*+ |
零次或多次出现 |
+ |
+? |
++ |
一次或多次出现 |
{n} |
{n}? |
{n}+ |
恰好n次出现 |
{n,m} |
{n,m}? |
{n,m}+ |
至少n次或至多m次出现 |
{n,} |
{n,}? |
{n,}+ |
至少n次或至多m次出现 |
?:当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
二、 正则表达式高级使用
(?:pattern) :匹配 pattern 但不获取匹配结果,也就是说这是一个非捕获型匹配,不进行存储供以后使用。这在使用 "|" 字符来组合一个模式的各个部分是很有
用。例如要匹配 Rocky 和Ricky,那么R(?:o|i)cky较之 Rocky |Ricky表达更为简略。
(?=pattern) :正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串,匹配pattern前面的位置。这是一个非捕获型匹配,也就是说,该匹配不需要获取 供以后使用。
示例:
alert(/Windows (?=95|98|NT|2000)/.test('Windows 2000')); //true
alert(/Windows(?=95|98|NT|2000)/.test('Windows 2000')); //false
alert(/Windows (?=95|98|NT|2000)/.test('Windows 3.1')); //false
预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) :负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串, 匹配后面不是pattern的位置,这也是一个非捕获型匹配。
示例:
alert(/Windows (?!95|98|NT|2000)/.test('Windows 2000')); // false
alert(/Windows(?!95|98|NT|2000)/.test('Windows 2000')); // true
alert(/Windows (?!95|98|NT|2000)/.test('Windows 3.1')); // true
\数字: 反向引用,通过数字编号引用前面的内容
示例:
alert(/ba(na)\1/.test('banana')); //true
alert(/(\d{4})\1(\d{2})\1/.test('12341234121234')); //true
alert(/(\d{4})\1(\d{2})\2/.test('123412341212')); //true
三、正则表达式中参数的使用
1、g:表明可以进行全局匹配。
① 对于表达式对象的exec方法,不加入g,则只返回第一个匹配,无论执行多少次均是如此,如果加入g,则第一次执行也返回第一个匹配,再执行返回第二个匹配,依次类推。
例如:
var regx=/user\d/;
var str=“user18dsdfuser2dsfsd”;
var rs=regx.exec(str);//此时rs的值为{user1}
var rs2=regx.exec(str);//此时rs的值依然为{user1}
如果regx=/user\d/g;则rs的值为{user1},rs2的值为{user2}
通过这个例子说明:对于exec方法,表达式加入了g,并不是说执行exec方法就可以返回所有的匹配,而是说加入了g之后,我可以通过某种方式得到所有的匹配,这里的方式对于exec而言,就是依次执行这个方法即可。
② 对于match方法,不加入g,只是返回第一个匹配,而且一直执行match方法也总是返回第一个匹配,但加入g,则一次返回所有的匹配(注意是“所有”)。
例如:
var regx=/user\d/;
var str=“user1sdfsffuser2dfsdf”;
var rs=str.match(regx);//此时rs的值为{user1}
var rs2=str.match(regx);//此时rs的值依然为{user1}
如果regx=/user\d/g,则rs的值为{user1,user2},rs2的值也为{user1,user2}
③ 对于String对象的replace方法,表达式不加入g,则只替换第一个匹配,如果加入g,则替换所有匹配。
④ 对于表达式对象的test方法,加g与不加g没有什么区别。
⑤ 对于String对象的split方法,加g与不加g是一样的。
⑥ 对于String对象的search方法,加不加g也是一样的。
2、i:忽略大小写匹配
示例:
alert(/[A-Z]/.test('a')); //false
alert(/[A-Z]/i.test('a')); //true
3、m:多行模式
示例:
var toMatch = "First second\nthird fourth\nfifth sixth";
var reg = /(\w+)$/g;
alert(toMatch.match(reg)); // sixth
假如将\n看作是换行符,此时也想匹配换行前的单词,即second,fourth,则可以使用多行模式:
var toMatch = "First second\nthird fourth\nfifth sixth";
var regm = /(\w+)$/gm;
alert(toMatch.match(regm)); // second,fourth,sixth,
四、正则表达式中test,exec,match,search方法比较
test(): 返回bool值,表示是否匹配成功。
exec(): 返回第一个匹配的字符串
match():返回所有匹配的字符串(数组)
search():返回在字符串中出现的第一个匹配的位置
示例:
var sToMatch = “a bat, a Cat, a fAt baT, a faT cat”;
var re = /at/;
re.test(sToMatch); //true
re.exec(sToMatch); //返回第一个at的实例(即bat中的那个)
re.match(sToMatch); //返回at,at,At,aT,aT,at组成的数组
re.search(sToMatch); //3
五、备注
1、 使用限定符时,如o{0,1},注意在逗号和两个数之间不能有空格
2、 一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。
出处:http://www.cnblogs.com/RockyMyx/
本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。