# 常用正则整理
# 正则预测
^
匹配一行的开头位置
(?![0-9]+$)
预测该位置后面不全是数字
(?![a-zA-Z]+$)
预测该位置后面不全是字母
[0-9A-Za-z] {6,10}
由6-10位数字或这字母组成
$
匹配行结尾位置
$pattern = '/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,10}$/';
var reg=/(\d{3})\d{4}(\d{4})/;
var phone="13423874592";
console.log( phone.replace(reg,("$1****$2")));//134****4592
var reg=/w.rar|zip|gz/;
var file="test.rar";
console.log(reg.test(file));
var reg=/^[a-zA-Z_0-9.-] @[a-zA-Z_0-9.-] .[a-zA-Z] $/;
var email="xiaoming.he-he@163.com";
console.log(reg.test(email));
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 字符串不确定空格分割js
var str="fdsfsdf dfsf dfsf dsfasf";
console.log(str.split(/[ ]+ /))
console.log(str.split(/\s+ /))
var str="aaa_big.img";
console.log(str.replace(/_big/,""));//aaa.img
2
3
4
5
6
7
8
# 匹配包括换行符在内的任意字符
- ([\s\S]*)
# 正则查找字符串
let reg=new RegExp("project","g");
let str='http://localhost:63342/project/test.html?_ijt=7eg35ek3pq5s7f4dgecpc89n4h;'
console.log(reg.test(str));
var str = 'abcdef';
var re = /B/i;
//var re = new RegExp('B','i'); 也可以这样写
alert( str.search(re) ); // 1
2
3
4
5
6
7
8
9
# match
在字符串中搜索复合规则的内容,搜索成功就返回内容,格式为数组,失败就返回null
用法: 字符串.match(正则)
量词: 至少出现一次 匹配不确定的次数(匹配就是搜索查找的意思)
全局匹配:g——global(正则中默认,只要搜索到复合规则的内容就会结束搜索 )
例子:找出指定格式的所有数字,如下找到 123,54,33,879
var str = 'haj123sdk54hask33dkhalsd879';
var re = /\d+/g;
// 每次匹配至少一个数字 且全局匹配 如果不是全局匹配,当找到数字123,它就会停止了。就只会弹出123.加上全局匹配,就会从开始到结束一直去搜索符合规则的。如果没有加号,匹配的结果就是1,2,3,5,4,3,3,879并不是我们想要的,有了加号,每次匹配的数字就是至少一个了
alert( str.match(re) ); // [123,54,33,879]
# 分组
写一个时间字符串 '2017-03-05'
, 正则表达式 /\d{4}-\d{2}-\d{2}/g
可以匹配它,如下,
let reg = /\d{4}-\d{2}-\d{2}/g;
let string = '2017-03-20'
let replaceString = string.replace(reg,"X");
console.log(replaceString) //X
2
3
4
$1
, $2
,$3
都是字符串,可以进行任意组合,我们就可以得到想要的结果, '$2/$3/$1', 我们就可以把一种日期格式,转化成另外一种日期格式
let reg = /(\d{4})-(\d{2})-(\d{2})/g;
let string = '2017-03-20'
let replaceString = string.replace(reg,"$2/$3/$1");
console.log(replaceString) // 03/20/2017
2
3
4
忽略分组:$n
获取分组的内容和正则表达式中的分组是一一对应的,正则表达式中有几个分组,它从左向右就会对应几个$n
, $1
永远获取的是第一个分组内容,$2
永远获取的都是第二个分组的内容,但有时候,我们想跳过某个分组,获取它下一个分组,比如$2
获取第三个分组的内容,这时正则表达式中的第二个分组前面要加 ?:
, 表示获取内容的时候可以忽略这个分组
let reg = /(\d{4})-(?:\d{2})-(\d{2})/g;
let string = '2017-03-20'
let replaceString = string.replace(reg,'$2'); // $2
console.log(replaceString) //20
2
3
4
在上面的代码中,我们在第二个分组前面加了 ?:
进行了忽略了,所以$2
获取的是第三个分组的内容。
分组还有一个概念,就是重复子项,它用1,2
来表示,它们只用在正则表达式中, 1
代表的也是第一个分组,2
代表的是第二个分组,它们主要的作用是匹配以下这种字符串,
121, 222, 323, 424
, 第一个数字和第三个数字相等,但又是不确定的数字, 所以在书写正则表达式时,必须保证第一项和第三项相等,第三项是第一项的复制,1
, 就是正则表达式中第一个分组的复制。
let reg = /(\d)2\1/g;
let string = '121 222 323 424'
let replaceString = string.replace(reg,'X');
console.log(replaceString) // X X X X
2
3
4
还有一个或的概念,符号表示为|
, /ab|ac/
, 当它们去匹配字符串时,只要出现其中的一个就算成功
将 ip
地址变为三位数
var str = "12.34.23.23 4.4.4.4 45.456.456.453" // 假设这是三个ip
str.replace(/(\d+)/g,"00$1").replace(/0*(\d{3})/g,"$1"); // 012.034.023.023 004.004.004.004 045.456.456.453
2
# 正则断言
语法如下:
String(Number).replace(/(\d)(?=(\d{3})+$)/g, "$1,");
举例:
String(123456789).replace(/(\d)(?=(\d{3})+$)/g, "$1,");
// or
'123456789'.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
//结果是:123,456,789
2
3
4
5
6
7
8
9
如果为小数则为: '1234567890030.7890'.replace(/(?=\B(?:\d{3})+\b)(\d{3}(\.\d+$)?)/g,',$1');
// 整数小数都兼容 方法二:使用toLocaleString()
方法 语法如下:
Number.toLocaleString('en-US');
//举例:
(123456789).toLocaleString('en-US');
//结果是:123,456,789
2
3
4
5
对于中文场景下,toLocaleString('en-US')
中的'en-US'
理论上是可以缺省的,也就是直接(123456789).toLocaleString()
也是可以得到123,456,789
。但是如果你的产品可能海外用户使用,则保险起见,还是保留'en-US'
。
# jsonp转化json实战遇到的问题
qq音乐返回的jsonp数据,但是我们需要json数据,需要正则匹配
jsonp:"MusicJsonCallback({"retcode":0,"code":0,"subcode":0,"lyric":"W3RpOua8lOWRmF0KW2FyO……
我们需要大括号的内容,所以
// 其实我们不需要这个jsonp数据,这里我们做处理
if (typeof ret === 'string') {
var reg =/^\w+\(({[^()]+})\)$/
var matches = ret.match(reg)
if (matches) {
ret = JSON.parse(matches[1])
}
}
2
3
4
5
6
7
# 正则贪婪
- *? 重复任意次,但尽可能少重复
- ? 重复1次或更多次,但尽可能少重复
- ?? 重复0次或1次,但尽可能少重复
- {n,m}? 重复n到m次,但尽可能少重复
- {n,}? 重复n次以上,但尽可能少重复