常用正则整理

正则预测

^ 匹配一行的开头位置

(?![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));
1
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

1
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
1
2
3
4
5
6
7
8
9

match

在字符串中搜索复合规则的内容,搜索成功就返回内容,格式为数组,失败就返回null

  • 用法: 字符串.match(正则)

  • 量词: 至少出现一次 匹配不确定的次数(匹配就是搜索查找的意思)

  • 全局匹配:g——global(正则中默认,只要搜索到复合规则的内容就会结束搜索 )

例子:找出指定格式的所有数字,如下找到 123,54,33,879

var str = 'haj123sdk54hask33dkhalsd879';
1

var re = /\d+/g; // 每次匹配至少一个数字 且全局匹配 如果不是全局匹配,当找到数字123,它就会停止了。就只会弹出123.加上全局匹配,就会从开始到结束一直去搜索符合规则的。如果没有加号,匹配的结果就是1,2,3,5,4,3,3,879并不是我们想要的,有了加号,每次匹配的数字就是至少一个了

alert( str.match(re) ); // [123,54,33,879]
1

分组

写一个时间字符串 '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
1
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
1
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
1
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
1
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
1
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

1
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
1
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])
  }
}
1
2
3
4
5
6
7

正则贪婪

  • *? 重复任意次,但尽可能少重复
  • ? 重复1次或更多次,但尽可能少重复
  • ?? 重复0次或1次,但尽可能少重复
  • {n,m}? 重复n到m次,但尽可能少重复
  • {n,}? 重复n次以上,但尽可能少重复

今日图 - 全栈工程师的日常

16a763d28be4b200.gif