js正则表达式(regular expression)
一、js正则表达式的写法
正则表达式是*
通过简单的字符描述我需要的字符串格式
*,比如电话号码是啥样的。然后通过一些方法可以找到一个字符串中我需要的字符,或者替换这些字符。正则的匹配的是字符和位置。’abcd‘有4个字符和5个位置。
http://www.jb51.net/article/110516.htm感觉这个写的满靠谱的。
#####1.正则对象RegExp
example1
//正则对象的创建
var regex = new RegExp('a','g');
var regex = /a/g;
上面两种创建方式都可以,推荐第二种。为啥?字少啊。
2.转义符
特殊含义的字符需要转移,比如\
:
example2
var regex = /aa\\/;//这里的'\\'表示'\'
3.锚点
用来描述开始(^
)和结束($
)。
example3
var regex = /^abc$/;//匹配的是开始后面是abc,然后就是结束了。
4.标识符
全局匹配
g
(global),忽略大小写i
(ignoreCase),多行匹配m
(multline)。
example4
var regex = /a/gi;//这里是全局匹配且忽略大小写
5.常用的元字符
字符 | 描述 |
---|---|
\d | 数字0-9 |
\D | 非数字 |
\w | 字母、数字、下划线 |
\W | 非字母、数字、下划线 |
\s | 空白字符 |
\S | 非空白字符 |
\b | 单词边界。er\b匹配reffer,但不匹配person |
\B | 和\b相反 |
. | 除(\n,\r)的其他单个字符 |
… | 其他的不列举了 |
example5
var regex = /\ba/;
console.log(regex.test('abc'));//true
console.log(regex.test('xabc'));//false
6.字符集
[]
和^
。^
在[]
中间或者单独使用表示^
字符,否则表示非。
example6
var regex = /[1a_][a-z][^A-S][0-9]/;
//1、a、_中的任意一个字符 + a到z之间的任意一个字符 + 非A到S之间的任意一个字符 + 0到9之间的数字
7.量词
字符 | 描述 |
---|---|
* | >=0 |
+ | >=1 |
? | 0或1 |
{m} | m |
{m,} | >=m |
{m,n} | >=m&&<=n |
example7
var regex = /a*b+c?d{2}e{3}f{3,6}/;
//>=0个a + >0个b + 0或1个c + 2个d + 3个e + 3到6个f
默认的量词为贪婪模式,量词后面在加个
?
就是惰性模式。关于解释可以看:http://blog.csdn.net/xlei1123/article/details/51755064。
贪婪模式: 会尽可能多的去匹配满足的字符。
惰性模式: 会尽可能少的去匹配满足的字符。
example8
var str = 'aaab';
var regex = /a+?/g;
var regex2 = /a+/g;
console.log(str.match(regex));//["a", "a", "a"]
console.log(str.match(regex2));//["aaa"]
8.子集
()
用来分组,且分的组会作为一种匹配产生一个子集。
example9
var str = 'abcbcdef abcbcdefg';
var regex = /a(bc){1,2}d/g;
console.log(str.match(regex));//["abcbcd", "abcbcd"]
console.log(regex.exec(str));//["abcbcd", "bc", index: 0, input: "abcbcdef" ]
**非捕获性分组: ** (?:pattern)
、(?=pattern)
、(?!pattern)
,(?<=pattern)
、(?<!pattern)
这5个分组都不会作为匹配的子集。后四个不会作为匹配结果。后两个js好像不兼容(测试了下,谷歌兼容,ie不兼容)。
example10
var regex = /a(?:bc)/;
var str = 'abcd';
console.log(regex.exec(str));//["abc", index: 0, input: "abcd"]
regex.compile('a(?=bc)');
console.log(regex.exec(str));//["a", index: 0, input: "abcd"]
正向前瞻: (?=pattern)
,有的地方叫正向肯定预查(look ahead positive assert),匹配后面满足pattern,不获取 匹配结果。
负向前瞻: (?!pattern)
,有的地方叫正向否定预查(negative assert),不匹配后面pattern,不获取 匹配结果。
example11
var regex = /a(?=b)/;
var str = 'abc';
console.log(regex.test(str));//true
regex.compile('a(?!b)');
console.log(regex.test(str));//false
正向后瞻: (?<=pattern)
,有的地方叫反向肯定预查(look behind),匹配前面满足pattern,不获取 匹配结果。ie不兼容。
负向后瞻: (?<!pattern)
,有的地方叫反向否定预查,不匹配前面pattern,不获取 匹配结果。ie不兼容。
example12
var regex = /(?<=b)a/;
var str1 = 'ab',
str2 = 'ba';
console.log(regex.test(str1));//false
console.log(regex.test(str2));//true
9.反向引用
用\n
表示引用前面第n个分组的引用。
example13
var regex = /(a)b\1/;//aba
var str = 'aba';
console.log(regex.exec(str));//["aba", "a", index: 0, input: "aba"]
10.或|
example14
var regex = /ab|cd/;
console.log(regex.test('abc'));//true
console.log(regex.test('cde'));//true
####二、js正则对象RegExp的属性和正则的一些方法
1.正则对象RegExp和其正则方法
example15
//正则对象的创建
var regex = new RegExp('a','g');
var regex = /a/g;
上面两种创建方式都可以,推荐第二种。为啥?字少啊。
RegExp构造函数包含一些属性,适用于作用域中的所有正则表达式,并且基于所执行的最近一次正则表达式操作而变化。
- RegExp.input或RegExp["$_"]:最近一次要匹配的字符串
- RegExp.lastMatch或RegExp["$&"]:最近一次匹配项
- RegExp.lastParen或RegExp["$+"]:最近一次匹配的捕获组
- RegExp.leftContext或RegExp["$`"]:input字符串中lastMatch之前的文本
- RegExp.rightContext或RegExp["$’"]:input字符串中lastMatch之后的文本
- RegExp["$n"]:表示第n个捕获组的内容,n取1-9
regex.compile(pattern, model): 修改正则对象的参数。
regex.exec(str): 将匹配的结果返回,返回值是一个数组(找不到返回null),包括匹配的字符和子集。如果是全局模式,那么regex会记录一个lastIndex,表示最后一次查询到的位置,下一次查询从这个位置开始。
regex.test(str): 匹配成功返回true,失败返回false。同样,如果是全局模式(g),那么下一次匹配会从lastIndex开始。
example16
var regex = /(ab)c/g;
var str = 'abcab';
console.log(regex.exec(str),regex.lastIndex);//["abc", "ab", index: 0, input: "abcab"] 3
console.log(regex.exec(str),regex.lastIndex);//null 0
console.log(regex.exec(str),regex.lastIndex);//["abc", "ab", index: 0, input: "abcab"] 3
console.log(regex.test(str),regex.lastIndex);//false 0
console.log(regex.test(str),regex.lastIndex);//true 3
console.log(regex.test(str),regex.lastIndex);//false 0
2.string的正则相关方法
str.search(regex): 返回匹配到的位置。匹配失败返回-1.
example17
var regex = /a/g;
var str = 'abcabc';
console.log(str.search(regex));//0
str.split(regex): 将字符串按照正则分割。返回数组。
example18
var regex = /a/;
var str = 'abcabc';
console.log(str.split(regex));// ["", "bc", "bc"]
str.replace(regex, str): 将字符串满足的地方用str替换。指定g修饰符,则会替换所有匹配正则的地方,否则只替换第一处。第二个参数是字符串可以使用一些特殊的字符序列,将正则表达式操作的值插进入,这是很常用的。
- $n:匹配第n个捕获组的内容,n取0-9
- $nn:匹配第nn个捕获组内容,nn取01-99
- $`:匹配子字符串之后的字符串
- $’:匹配子字符串之前的字符串
- $&:匹配整个模式得字符串
- $ : 表 示 :表示 :表示符号本身
example19
var regex = /(a)bc/g;
var str = 'abc abc';
console.log(str.replace(regex,'$1:$3:$`:$&:$$'));//a:$3::abc:$ a:$3:abc :abc:$
str.match(regex): 在字符串上调用match方法,和在正则上调用exec结果一样的。但是在全局时,match方法返回的结果数组是没有input和index属性的,也没有子集,并且会将所有满足的都返回,而exec每次执行只返回第一个匹配的结果。
example20
//match和exec在全局的不同
var regex = /a(b)/g;
var str = 'abcabc';
console.log(regex.exec(str));//["ab", "b", index: 0, input: "abcabc"]
console.log(str.match(regex));//["ab", "ab"]
最后两个东西,看下面:
example21
// 匹配中文
var str = "aa1511132小";
var pattern = /[\u4e00-\u9fa5]/;
console.log(pattern.test(str));//true
example22
var regex = /a/g;
var str = 'abc';
console.log(regex.test(str));//true
cosole.log(regex.test(str));//false
//全局的,会一个个匹配,RegExp的lastIndex记录了匹配的位置