"This is Regex".match(/\bis\b/);
"\b" 不会匹配is 两边的字符,但它会识别is 两边是否为单词的边界。几种反义:改成大写,意思就与原来的相反。
如:
"\W":匹配任何非单词字符。等价于'[^A-Za-z0-9_]'。
"[^abc]":匹配除了abc以外的任意字符。
字符转义:在正则表达式中元字符是有特殊的含义的,当我们要匹配元字符本身时,就需要用到字符转义,如:/\./.test("."); // true
"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"]
解释这个例子:
1、(\b[a-zA-Z]+\b) 是一个捕获分组,它捕获所有的单词,
" asd sf hello hello asd".match(/(\b[a-zA-Z]+\b)/g) // ["asd", "sf", "hello", "hello", "asd"]
注:加上/g这个处理选项是便于我理解,没有这个选项的时候,只输出第一个单词asd。
2、\s加了一个空格限制条件,所以最后一个单词被排除,
" asd sf hello hello asd".match(/(\b[a-zA-Z]+\b)\s/g) \\ ["asd ", "sf ", "hello ", "hello "]
3、"\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>/g, '')
[$1表示/(.?)<\/span>/g中的“(.?)”)匹配的字符串]
答案来解答。
用来分割字符串
"abchelloasdasdhelloasd".split(/hello/); //["abc", "asdasd", "asd"]
用来捕获字符串中的子字符串到一个数组中。默认情况下只捕获一个结果到数组中,正则表达式有”全局捕获“的属性时(定义正则表达式的时候添加参数g),会捕获所有结果到数组中。
"abchelloasdasdhelloasd".match(/hello/); //["hello"]
"abchelloasdasdhelloasd".match(/hello/g); //["hello","hello"]
和字符串的match方法类似,这个方法也是从字符串中捕获满足条件的字符串到数组中,但是也有两个区别。
1、exec方法一次只能捕获一份子字符串到数组中,无论正则表达式是否有全局属性
/hello/g.exec("abchelloasdasdhelloasd"); // ["hello"]
2、正则表达式对象(也就是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