工做上遇到一个这样的需求:javascript
用正则表达式将一个字符串中的span标签替换为img标签,并将原span标签的内容放到img标签的src中,问题详细描述:点我html
看到这个需求,我知道应该能够用正则表达式,但是因为以前没怎么用,一想到正则表达式就头大,一堆各类各样的特殊符号,彷佛没有规律可循,有点难以理解。不过知道本身不能逃避,因而本身就去尝试怎么写这个正则表达式来解决个人需求,上述中提到的问题详细描述,大概就是我思考的过程,问题提出后立马有人解答,看完他们的答案后,惭愧,感受到本身知识的欠缺,再不学习就老了(┬_┬)java
"This is Regex".match(/\bis\b/);
"\b" 不会匹配is 两边的字符,但它会识别is 两边是否为单词的边界。几种反义:改为大写,意思就与原来的相反。
如:
"\W":匹配任何非单词字符。等价于'[^A-Za-z0-9_]'。
"[^abc]":匹配除了abc之外的任意字符。正则表达式
字符转义:在正则表达式中元字符是有特殊的含义的,当咱们要匹配元字符自己时,就须要用到字符转义,如:/\./.test("."); // true
segmentfault
"aaaaaa".match(/a*/) // ["aaaaaa"]
"aaaaaa".match(/a?/) // ["a"]
"aaaaaa".match(/a+/) // ["aaaaaa"]
"aaaaaa".match(/a{3}/) // ["aaa"]
"aaaaaa".match(/a{3,4}/) // ["aaaa"]
"aaaaaa".match(/a{3,}/) // ["aaaaaa"]
"aabab".match(/a.*?b/) // ["aab"]
为何第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,由于正则表达式有另外一条规则,比懒惰/贪婪规则的优先级更高:最早开始的匹配拥有最高的优先权。"aabab".match(/a.+?b/) // ["aab"]
"aabab".match(/a.??b/) // ["aab"]
"aaa".match(/a{1,3}?/) // ["a"]
"aaa".match(/a{1,}?/) // ["a"]
正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供之后使用这一能力。对一个正则表达式模式或部分模式两边添加圆括号将致使这部分表达式存储到一个临时缓冲区中。(可使用非捕获元字符 '?:', '?=', 或 '?!' 来忽略对这部分正则表达式的保存。)数组
所捕获的每一个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每一个缓冲区均可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。函数
后向引用一个最简单,最有用的应用是提供了肯定文字中连续出现两个相同单词的位置的能力。学习
举个例子:测试
/(\b[a-zA-Z]+\b)\s+\1\b/.exec(" asd sf hello hello asd"); //["hello hello", "hello"]
解释这个例子:spa
一、(\b[a-zA-Z]+\b) 是一个捕获分组,它捕获全部的单词,
" asd sf hello hello asd".match(/(\b[a-zA-Z]+\b)/g) // ["asd", "sf", "hello", "hello", "asd"]
注:加上/g这个处理选项是便于我理解,没有这个选项的时候,只输出第一个单词asd。
二、\s加了一个空格限制条件,因此最后一个单词被排除,
" asd sf hello hello asd".match(/(\b[a-zA-Z]+\b)\s/g) \\ ["asd ", "sf ", "hello ", "hello "]
三、"\1"后向引用,
" asd sf hello hello asd".match(/(\b[a-zA-Z]+\b)\s+\1\b/g) \\ ["hello hello"]
说实话,这个例子花了我很长时间去理解,有一点点想通,感受这个概念看起来容易,写起来并不容易啊。
/(hello)\sworld/.exec("asdadasd hello world asdasd") // ["hello world", "hello"]
/(?:hello)\sworld/.exec("asdadasd hello world asdasd") // ["hello world"]
/hello\s(?=world)/.exec("asdadasd hello world asdasd") // ["hello "]
/hello\s(?!world)/.exec("asdadasd hello world asdasd") //null world改变一下: /hello\s(?!world)/.exec("asdadasd hello wosrlds asdasd") //["hello "]
/(?!<\d)123/.exec("abc123 ") // ["123"]
在JavaScript中定义一个正则表达式语法为:
var reg=/hello/ 或者 var reg=new RegExp("hello")
接着列举一下JavaScript中可使用正则表达式的函数,并简单介绍一下这些函数的做用。
用来找出原字符串中某个子字符串首次出现的索引index,没有则返回-1。能够在官方文档中了解更多。
"abchello".search(/hello/); // 3
用来替换字符串中的子串。简单例子:
"abchello".replace(/hello/,"hi"); // "abchi"
在官方文档中有提到:
若是第一个参数是 RegExp对象,那么替换字符串能够插入特殊变量名$n,n是个小于100的非负整数,表示插入第 n 个括号匹配的字符串。
因此我在文中一开始提到的需求就能够用
str.replace(/<span>(.*?)<\/span>/g, '<img src="$1"/>')
[$1表示/(.?)</span>/g中的“(.?)”)匹配的字符串]
答案来解答。
用来分割字符串
"abchelloasdasdhelloasd".split(/hello/); //["abc", "asdasd", "asd"]
用来捕获字符串中的子字符串到一个数组中。默认状况下只捕获一个结果到数组中,正则表达式有”全局捕获“的属性时(定义正则表达式的时候添加参数g),会捕获全部结果到数组中。
"abchelloasdasdhelloasd".match(/hello/); //["hello"] "abchelloasdasdhelloasd".match(/hello/g); //["hello","hello"]
和字符串的match方法相似,这个方法也是从字符串中捕获知足条件的字符串到数组中,可是也有两个区别。
一、exec方法一次只能捕获一份子字符串到数组中,不管正则表达式是否有全局属性
/hello/g.exec("abchelloasdasdhelloasd"); // ["hello"]
二、正则表达式对象(也就是JavaScript中的RegExp对象)有一个lastIndex属性,用来表示下一次从哪一个位置开始捕获,每一次执行exec方法后,lastIndex就会日后推,直到找不到匹配的字符返回null,而后又从头开始捕获。 这个属性能够用来遍历捕获字符串中的子串。
var reg=/hello/g; reg.lastIndex; //0 reg.exec("abchelloasdasdhelloasd"); // ["hello"] reg.lastIndex; //8 reg.exec("abchelloasdasdhelloasd"); // ["hello"] reg.lastIndex; //19 reg.exec("abchelloasdasdhelloasd"); // null reg.lastIndex; //0
用来测试字符串中是否含有子字符串
/hello/.test("abchello"); // true
总算是对正则表达式了解了一些,要熟练掌握还需后面多多实践^_^
参考资料:
1.http://www.cnblogs.com/zery/p/3438845.html
2.http://www.cnblogs.com/tzyy/p/4927476.html
3.http://www.codeyyy.com/regex/index.html