正则表达式在线测试工具
http://tool.oschina.net/regex/
JavaScript中通过内置对象RegExp支持正则表达式
两种方式实例化RegExp
1字面量 var reg=/\bis\b/g
2构造函数 var reg=new RegExp("\\bis\\b","g")
// js中反斜线本来就是特殊字符写两次是为了转义。
元字符
\t 水平制表符
\v 垂直制表符
\n 换行符
\r 回车符
\0 空字符
\f 换页符
\cX 与x对应的控制字符(ctrl+X)
字符类
[abc]把字符a、b、c归为一类
如 'abcde'.replace(/[abc]/g,A) ="AAAde";
字符类取反
[^abc]
如'abcde'.replace(/[^abc]/g,A) ="abcAe";
范围类
[a-z] 闭区间 包括a到z任意字符
[a-zA-Z]
[a-zA-Z-] 匹配-
预定义类
. [^/r/t] 除了回车符和换行符之外的所有字符
\d [0-9] 数字
\D [^0-9] 非数字
\s [\t\n\x\0B\f\r] 空白符
\S [^\t\n\x\0B\f\r] 非空白符
\w [a-zA-Z_0-9] 单词字符(字母,数字,下划线)
\W [^a-zA-Z_0-9] 非单词字符(字母,数字,下划线)
修饰符
g global 全文搜索匹配
i ignore case 忽略大小写,默认为大小写敏感
m multiple lines 多行搜索
lastIndex 是当前表达式匹配的最后一个字符的下一个位置
source 正则表达式的文本字符串
m multiple lines 多行搜索
边界
^ 以xx开始 在[]中表示取反
$ 以xx结束
\b 单词边界
\B 非单词边界
量词
? 零次或者一次
+ 一次或者多次
* 任意次
{n} 出现n次
{n,m} 出现n次到m次
{n,} 至少出现n次
贪婪模式
\d{1,3}
尽可能多的匹配
非贪婪模式
在量词后面加上?
\d{1,3}?
后边多一个?表示懒惰模式。
必须跟在*或者+后边用
如:
<img src="test.jpg" width="60px" height="80px"/>
如果用正则匹配src中内容非懒惰模式匹配
src=".*"
匹配结果是:src=“test.jpg” width=“60px” height=“80px”
意思是从="往后匹配,直到最后一个"匹配结束
懒惰模式正则:
src=".*?"
结果:src=“test.jpg”
因为匹配到第一个"就结束了一次匹配。不会继续向后匹配。因为他懒惰嘛。
.表示除\n之外的任意字符
*表示匹配0-无穷
+表示匹配1-无穷
分组
针对于量词匹配
/([a-z]\d){3}/g
或
/Byron|Casper/ , 匹配的是 Byron或者Casper , | 两边默认有分组
/Byro(n|C)asper/ 匹配的是Byronaspe或ByroCasper
反向引用
'2016-12-09'.replace(/(\d{4})-(\d{2})-(\d{2})/g,)
忽略分组
在分组内加上?:
/(?:zcq)(ok)/
前瞻
'a2*3aa3'.replace(/\w(?=\d)/g,"A") 正向前瞻
'a2*3aa3'.replace(/\w(?!\d)/g,"A") 反向前瞻
(?=\d)断言部分不算在匹配规则内,只作为过滤条件
^用法
用法一: 限定开头
文档上给出了解释是匹配输入的开始,如果多行标示被设置成了true,同时会匹配后面紧跟的字符。 比如 /^A/会匹配"An e"中的A,但是不会匹配"ab A"中的A
用法二:(否)取反
当这个字符出现在一个字符集合模式的第一个字符时,他将会有不同的含义。
比如: /[^a-z\s]/会匹配"my 3 sisters"中的"3" 这里的”^”的意思是字符类的否定,上面的正则表达式的意思是匹配不是(a到z和空白字符)的字符。
表示限定开头的示例:
/[(^\s+)(\s+$)]/g
表示否定的示例:
[^a]表示“匹配除了a的任意字符”。
[^a-zA-Z0-9]表示“找到一个非字母也非数字的字符”。
经过对比,只要是”^”这个字符是在中括号”[]”中被使用的话就是表示字符类的否定,如果不是的话就是表示限定开头。我这里说的是直接在”[]”中使用,不包括嵌套使用。
其实也就是说”[]”代表的是一个字符集,”^”只有在字符集中才是反向字符集的意思。
$
$是正则表达式匹配字符串结束位置
\1
表示所获取的第1个()匹配的引用
var str = “Hellllo world”;
str = str.replace(/(l)\1/g, ‘$1’);
对于正则表达式 /(l)\1/g,其中(l)是第一个分组,\1指向第一个分组,即\1重复了第一个分组的内容,所以该正则表达式可以表示成/(ll)/g
而对于第二个参数$1,表示用第一个分组的内容 l 对匹配到的部分进行替换(即 ll 替换成 l ),同时正则表达式有g表示全局匹配,所以4个ll被替换成2个ll。
方法
RegExp.prototype.test(str)
用于测试字符串参数中是否存在匹配正则表达式模式的字符串
存在 true
不存在 false
test方法加g标志导致正则表达式不稳定
原因:lastIndex
RegExp.prototype.exec(str)
使用正则表达式对字符串进行搜索,并将更新全局RegExp对象的属性以反映匹配的结果
如果没有匹配的文本则发挥null,否则返回一个结果数组:
index 声明匹配文本的第一个字符的位置
input 存放被检索的字符串string
字符串对象方法
String.prototype.search(reg)
search()方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
方法返回第一个匹配结果的index,查找不到返回-1
search()方法不支持全局匹配,忽略g标志,并且总是从字符串的开始进行检索。
‘aadacff11111’.search(1)
String.prototype.match(reg)
match方法将检索字符串,以找到与reg匹配的一个或者多个文本
非全局调用
在字符串中执行一次匹配 ,如果没有找到返回null ,否则返回一个存储匹配到文本的相关信息的数组[“1a2”,“a”],数组中第一个元素存放的是匹配到的文本(“1a2”),而其余的元素存放的是与正则表达式的子表达式匹配的文本(“a”)
除了常规的数组元素之外,返回的数组还有两个对象属性
index 声明匹配文本的起始字符串在字符串中的位置
input 声明对stringObject的应用
全局调用
转义
使用反斜杠进行转义