写的好的正则的总结文章太多了,这里仅记录一些自己容易忘记的,可以随时来查查
详细了解可以阅读http://www.cnblogs.com/tugenhua0707/p/5037811.html 这位大大的整理
自己需要回顾查看的有
一.支持正则的方法
String中
1.search(pattern) 返回查到的位置,总是不执行全局匹配,忽略g,同时每次都从开始位置查找
2. match(pattern) 类似于indexOf(),但是返回值为匹配到的文本的数组集合
3. replace(pattern,replacement) 返回替换后的新字符串
这里的replacement可以是一个字符串,也可以是一个返回字符串的函数
ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。
当出现g的时候,每次匹配将调用1次replace,他arguments有3个长度,第一个是匹配到的字符串,第二个是她所在的位置,第三个是整个原字符串(第二次第三次第n次匹配到调用的时候都是原字符串)
我们可以这样来看
var replaceTime = 0;
string.replace(regex,function(){
console.log("============第" + ++replaceTime + "次匹配替换============");
for(var i = 0,argLength = arguments.length;i < argLength;i++) {
console.log("第" + (i + 1) + "个参数内容 = " + arguments[i]);
}
});
(来自https://www.baidufe.com/item/40cb68b3270ac0a1ddc0.html)
在replacement里,$有特殊的含义 $1表示第一个捕获的分组
| $1、$2、...、$99 | 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。 |
| $& | 与 regexp 相匹配的子串。 |
| $` | 位于匹配子串左侧的文本。 |
| $' | 位于匹配子串右侧的文本。 |
| $$ | 直接量符号。 |
(来自w3school)
但是似乎函数中不能直接用,需要用RegExp["$`"]这样的方式
4.split(separator,[ howmany]) howmany控制返回的最大数量
RegExp中
1.text(str) 返回boolean
2.exec(str) 在全局模式下,他会保存上一次的位置,然后继续找下去
例子
var x = "a.xxx.com b.xxx.com c.xxx.com";
var re = /\s?(.*?).xxx.com/g;
while( tempR = re.exec(x))
{
console.log(tempR[1]);
}
exec() 都会把完整的细节添加到它返回的数组中。这就是 exec() 与 String.match() 的不同之处,后者在全局模式下返回的信息要少得多。
二.元字符
| 元字符 | 描述 |
| . | 查找任意的单个字符,除换行符外 |
| \w | 任意一个字母或数字或下划线,A_Za_Z0_9,_中任意一个 |
| \W | 查找非单词的字符,等价于[^A_Za_z0_9_] |
| \d | 匹配一个数字字符,等价于[0-9] |
| \D | 匹配一个非数字字符,等价于[^0-9] |
| \s | 匹配任何空白字符,包括空格,制表符,换行符等等。等价于[\f\n\r\t\v] |
| \S | 匹配任何非空白字符,等价于[^\f\n\r\t\v] |
| \b | 匹配一个单词边界,也就是指单词和空格间的位置,比如’er\b’可以匹配”never”中的”er”,但是不能匹配”verb”中的”er” |
| \B | 匹配非单词边界,’er\B’能匹配’verb’中的’er’,但不能匹配’never’中的’er’ |
| \0 | 查找NUL字符。 |
| \n | 匹配一个换行符 |
| \f | 匹配一个换页符 |
| \r | 匹配一个回车符 |
| \t | 匹配一个制表符 |
| \v | 匹配一个垂直制表符 |
| \xxx | 查找一个以八进制数xxx规定的字符 |
| \xdd | 查找以16进制数dd规定的字符 |
| \uxxxx | 查找以16进制数的xxxx规定的Unicode字符。 |
三.量词
| 量词 | 描述 |
| n+ | 匹配任何至少包含一个n的字符串 |
| n* | 匹配零个或者多个n的字符串 |
| n? | 匹配零个或者1个n的字符串 |
| n{x} | 匹配包含x个n的序列字符串 |
| n{x,y} | 匹配至少x个,最多y个n的字符串 |
| n{x,} | 匹配至少x个的字符串 |
| n$ | 匹配以n结尾的字符串 |
| ^n | 匹配以n开头的字符串 |
| ?=n | 匹配其后紧接指定的n字符串 |
| ?!n | 匹配其后没有紧接指定的n字符串 |
其中 对?= 取一个例子
var str="my name is longen";
// 匹配以na其后紧接m的字符串
// ?= 只是匹配位置,不会返回值
console.log(str.match(/na(?=m)/g)); //["na"]
| 左右两边表达式之间 “或” 关系
()既表示整体,又表示捕获
四.贪婪模式与非贪婪模式
贪婪模式在整个表达式匹配成功的情况下尽可能多的匹配;非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配
非贪婪模式就是在贪婪模式后加上一个?
五.环视
环视在语言精粹中表明并不重要,不整理
六.捕获组与反向应用
捕获的例子:
var num = "11 22";
var n = num.replace(/(\d+)\s*(\d+)/,"$2 $1");
console.log(n); // 22 11
反向引用的例子:
console.log(/(longen)\1/.test("longen")); // false
console.log(/(longen)\1/.test("longenlongen")); // true
非捕获性分组
在分组的左括号的后面紧跟?:
非捕获性分组的例子:
var num2 = "11 22";
/#(?:\d+)/.test(num2);
console.log(RegExp.$1); //""
10万+

被折叠的 条评论
为什么被折叠?



