console.log("http://imgs.jpg".replace(/http:(\/\/.+\.jpg)/,"$1")) //"imgs.jpg"
console.log("2015/02/23".replace(/(\d{4})[/-](\d{2})[/-](\d{2})/,'$2-$3-$1')) // "02-23-2015"
边界:正则表达式还提供了几个常用的边界匹配字符
字符 | 含义 |
---|---|
^ | 以xxx开始 |
$ | 以xxx结束 |
\b | 单词边界 |
\B | 非单词边界 |
var reg =/\bis\b/g 'he is a body is he'.replace(reg,'IS') // "he IS a body IS he"
g : global 全文搜索
i : ignore case 忽略大小写 ,默认大小写敏感
m : multiple lines 多行搜索
lastIndex : 当前表达式匹配内容的最后一个字符的下一个位置
source: 正则表达式的文本字符串
var reg =/\bis\b/gi 'he is a body, Is he'.replace(reg,'0') // "he 0 a body 0 he" var mulStr = ''@123 @456 @789" // 含有换行符的文本 mulStr.replace(/^@\d/g, 'x') // ''x23 @456 @789" mulStr.replace(/^@\d/gm, 'x') // "x23 x56 x89 "
var reg1 = /\w/ var reg2 = /\w/gim reg1.source // "\w" reg1.global // false reg1.ignoreCase // false reg1.multiline // false
元字符
正则表达式you两种基本字符类型组成:
-- 原义 文本字符
-- 元字符
元字符是在正则表达式中有特殊含义的非字母字符
* + ? $ ^ . | \ ( ) { } [ ]
字符 | 含义 |
---|---|
\t | 水平制表符 |
\v | 垂直制表符 |
\n | 换行符 |
\r | 回车符 |
\0 | 空字符 |
\f | 换页符 |
\cX | 与X对应的控制字符(Ctrl + X) |
范围类
在 [ ] 组成的类内部是这样连写的[a-zA-Z]
'a1b2d3x4z9'.replace(/[a-z]/g, 'Q') // "Q1Q2Q3Q4Q9" "2016-09-12".replace(/[0-9]/g, 'A') // "AAAA-AA-AA" "2016-09-12".replace(/[0-9-]/g, 'A') // "AAAAAAAAAA"
贪婪模式
'12345678'.replace(/\d{3,6}/g,'x') // 'x78'
非贪婪模式
-- 让正则表达式尽可能少的匹配,也就是说一但成功匹配不再继续尝试
-- 做法很简单,在量词后加上?即可
'123456789'.match(/\d{3,5}?/g) // ["123", "456", "789"] '12345678'.replace(/\d{3,6}/g,'x') //"x78" '12345678'.replace(/\d{3,6}?/g,'x') //"xx78"
分组 使用()可以达到分组的功能,使量词作用于分组
(Byron){3}
'a1b2c3d4'.replace(/([a-z]\d){3}/g,'x') // "xd4"
忽略分组:不希望捕获某些分组,只需要在分组内加上?:就可以
(?:Byron).(ok)
或:使用 | 可以达到或的效果
Byron | Casper
Byr(on|Ca)sper
'ByronCasper'.replace(/Byron|Casper/g,'x') // "xx" 'ByronsperByrCasper'.replace(/Byr(on|Ca)sper/g,'x') //"xx"
字符 | 含义 |
---|---|
? | 出现零次或一次(最多出现一次) |
+ | 出现一次或多次(至少出现一次) |
* | 出现零次或多次(任意次) |
{n} | 出现n次 |
{n,m} | 出现n到m次 |
{n,} | 至少出现n次 |
前瞻 :正则表达式从文本头部向尾部开始解析,文本尾部方向,称为‘前’,前瞻就是正则表达式匹配到规则的时候,向前检查是否符合断言
符合和不符合特定断言称为 肯定/正向匹配和否定/负向 匹配
名称 | 正则 |
---|---|
正向前瞻 | exp(?=assert) |
负向前瞻 | exp(?!assert) |
'a2*3'.replace(/\w(?=\w)/g,'x') // "x2*3" 'a2*34v8'.replace(/\w(?=\w)/g,'x') // "x2*xxx8" 'a2*34vv'.replace(/\w(?!\d)/g,'x') //"ax*3xxx" // 不会替换前瞻,只是作为判断条件
字符 | 等价类 | 含义 |
---|---|---|
. | [^\r\n] | 除了回车符和换行符之外的所有字符 |
\d | [0-9] | 数字字符 |
\D | [^0-9] | 非数字字符 |
\s | [\t\n\x0B\f\r] | 空白符 |
\S | [^\t\n\x0B\f\r] | 非空白符 |
\w | [a-aA-Z_0-9] | 单词字符(字母,数字,下划线) |
\W | [^a-aA-Z_0-9] | 非单词字符 |
‘a1b2c3d4’.replace(/[a,b,c]/g,'x') //"x1x2x3d4"
RegExp的test()方法
用于测试字符串参数中是否存在匹配正则表达式模式的字符串 如果存在则返回true, 否则返回false var reg1 = /\w/ //使用test方法正则表达式不要写成全局(会受到reg1的lastIndex影响,有时候返回true有时候false,结果不稳定) reg1.test('ab')
exec()
var reg = /\d(\w)\d/ var ts = '$1a2b3c4d5e' console.log(reg.exec(ts)) // ["1a2", "a", index: 1, input: "$1a2b3c4d5e", groups: undefined] console.log(reg.exec(ts).toString()) // '1a2,a'
var reg1 = /\d(\w)\d/g var ts = '$1a2b3c4d5e' while (ret = reg1.exec(ts)){ console.log(reg1.lastIndex,ret) }
match() 非全局调用 与 exec()非全局调用返回的结果一样
var reg = /\d(\w)\d/ var ts = '$1a2b3c4d5e' ret = ts.match(reg) console.log(ret) // ["1a2", "a", index: 1, input: "$1a2b3c4d5e", groups: undefined] ret.input = "$1a2b3c4d5e" ret.index= 1
match() 全局调用
没有找到任何匹配的子串,则返回null
如果找到了一个或者多个子串,则返回一个数组 (数组中存放的是所以得匹配子串。不存在index属性或input属性)
ret = ts.match(reg1) console.log(ret ) // ["1a2", "3c4"]
replace(要替换的内容,替换成的内容)
第二个参数可以是一个函数 function
function有4个参数
1、匹配字符串
2、正则表达式分组内容,没有分组则没有该参数
3、匹配项在字符串中的index
4、原字符串
ts.replace(/\d/g, function(match,index,origin) { console.log(index); return parseInt(match)+1 // "$2a3b4c5d6e" })
ts.replace(/(\d)(\w)(\d)/g,function(match,group1,group2,group3,index,origin){ return group1+ group2 // "$1ab3cd5e" })
string的search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串 方法返回第一个匹配结果index, 查找不到返回-1 search() 方法不执行全局匹配,它将忽略标志g,并且总是从字符串的开始进行检索
split方法把字符串分割成字符数组
‘a,b,c,d’ .split(',') // ["a","b","c","d"]
在一些复杂的分割情况下我们可以使用正则表达式解决
'a1b2c3d',split(/\d/) //["a","b","c","d"]