js的正则一

正则表达式一

强大的字符串匹配工具

RegExp对象

  • js风格:new RegExp("a","i")
  • perl风格:/a/i

作用

  • 表单验证
  • 网络爬虫
  • 内容获取替换

简单使用

1
2
3
4
5
6
var str = 'hello world!';
//var reg = /具体内容/;
var reg = /world/;

var rst = str.match(reg);
console.log(rst);

正则表达式的构成

定义字符集

  • [aeiou]表示aeiou这5个字符其中的某一个字符
  • [a-zA-Z0-9_-]表示大写、小写字母、0-9、下划线、中划线中的某一个字符

[9-3] [z-a]时错误的,不能从大往小写

1
2
3
4
5
var str = 'Today';
var reg = /[a-z]/;

var rst = str.match(reg);
console.log(rst);

特别字符集组成

  • $:匹配输入字符串得到结尾位置
  • ^(托字符):表示字符串的开始位置
  • ():标记一个子表达式的开始和结束位置
  • *:其前面那个单元出现0次或以上
  • +:其前面那个单元出现1次或以上
  • ?:其前面那个单元出现0次或1次
  • {m}:其前面那个单元出现m次
  • .:匹配除换行符\n之外的任何单字符
  • \:这个符号是用来转义的
  • |:指明两项之间的一个选择
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//*
var str1 = "2018-1-1";
var str2 = "today:2018-1-1";
var reg1 = /[0-9]*/;

var rst1 = str1.match(reg1);
var rst2 = str2.match(reg1);
console.log(rst1);//["2018"]

//T前面出现0次数字,到T停止
console.log(rst2);//[""]

//+
var str3 = "goooogle";
var reg3 = /go+gle/;

var rst3 = str3.match(reg3);
console.log(rst3); //["goooogle"]


//?
var str4 = "google";
var reg4 = /go?gle/;

var rst4 = str4.match(reg4);
console.log(rst4);//null

//{m}
var str5 = "gooogle";
var reg5 = /go{3}gle/;

var rst5 = str5.match(reg5);
console.log(rst5);//[gooogle]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//|
var str = "pass or error";
var reg = /error|pass/;

var rst = str.match(reg);
console.log(rst);//输出[pass]

//.
var str2 = "ashd*&^&8";
var reg2 = /.*/;

var rst2 = str2.match(reg2);
console.log(rst2);//[ashd*&^&8]

//\
var str3 = "123.123";
var reg3 = /[0-9]+\.[0-9]+/;

var rst3 = str3.match(reg3);
console.log(rst3);//输出123.123
1
2
3
4
5
6
7
8
9
10
11
12
13
//^
var str1 = "headfoot";
var reg1 = /^foot/;

var rst1 = str1.match(reg1);
console.log(rst1);

//$
var str2 = "headfoot";
var reg2 = /foot$/;

var rst2 = str2.match(reg2);
console.log(rst2);//[foot]

^ $存在于全部的正确的正则表达式里边,保证正则对目标字符串的完整匹配

1
2
3
4
5
var str = "13022387107";
var reg = /^13[0-9]{9}$/;

var rst = str.match(reg);
console.log(rst);//[13022387107]

()作用:

  • 提高子表达式优先级
  • 从大的字符串里拆分小的字符串出来
  • 小括号模式单元 重复使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//()
var str = "gogogogogle";
var rsg = /(go)+gle/;
var rst = str.match(rsg);
console.log(rst);//["gogogogogle","go"]

var str2 = "<h1 style='color:red;'>哈哈</h1>";
var rsg2 = /<.*>(.*)<.*>/;
var rst2 = str2.match(rsg2);
console.log(rst2[1]);//输出 哈哈

var str3 = "2018-12-13 12:13:12";
//var rsg3 = /[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+/;
var rsg3 = /[0-9]+-([0-9]+)-([0-9]+) \1:\2:\1/;
//12重复了,可以优化一下
// \1表示前面第一个括号的内容 \2表示前面第二个括号的内容
//计数:从左到右 从外到里
var rst3 = str3.match(rsg3);
console.log(rst3);

模式修正符组成

  • i忽略大小写
  • g全局匹配
1
2
3
4
5
var str = "Today is 2018";
var reg = /[a-z]+/ig;

var rst = str.match(reg);
console.log(rst);//["Today", "is"]

组合字符

  • \d:表示数组[0-9]
  • \D:表示非数字[^0-9] ^非的意思 和 var reg1 = /^foot/;注意区分
  • \w:表示字母、数组、下划线其中一个[a-zA-Z0-9_]
  • \W:非字母、数字、下划线
  • \s:表示空格
  • \S:表示非空格
  • \b:表示单词边界 (单词边界也就是单词旁边有没有空格,有空格就是边界)
  • \B:表示非单词边界
1
2
3
var str = "al12 all 2012";
var rsg = /\d+/;
console.log(str.match(rsg));

限定字符

  • {m}:其前一单元严格出现m次
  • {m,}:其前一单元出现至少m次,至多不限制
  • {m,n}:其前一单元出现至少m,至多n次
  • {,n}:最多出现n次

中文

  • [\u4e00-\u9fa5]:中文第一个字到最后一个字

正向反向预查

正向预查

正向匹配

要查出来的内容,右边必须出现执行的信息,并且其是辅助条件,不是结果的一部分

1
var reg = /需要查找的内容(?=辅助条件)/;

例子

1
var reg = /[a-z]+(?=\d+)/;

加粗为匹配到

beijing2008

shanGhai1026

使用

1
2
3
4
var str = "http://www.baidu.com/index.php?name=jack&age=18&addr=shanghai";
//取出name age addr
var rsg = /[a-z]+(?==)/g;
console.log(str.match(rsg));

正向不匹配

要查找出来的内容,右边不能出现指定的信息,右边的信息是辅助条件,非结果部分

1
var reg = /要查找的内容(?!辅助条件)/;

例子

1
var reg = /good(?!\d+)/;

good123

good_good

反向预查(php支持)

反向匹配

辅助条件和正向匹配相反

1
var reg = /(?<=辅助条件)查找内容/;

反向不匹配

1
var reg = /(?<!辅助条件)查找内容/;

demo

正则匹配ip地址

ip地址的特性

  • 第一段:1-223
    • 个位数:[1-9]
    • 十位数:[1-9]\d
    • 百位数:[1]\d\d
    • 二百位数:200-223
      • 200-219:2[01]\d
      • 220-223:22[0-3]
    • reg = /^([1-9]|[1-9]\d|[1]\d\d|2[01]\d|22[0-3])$/;
  • 第二、三、四段:0-255
    • 个位数:[0-9]
    • 十位数:[0-9]\d
    • 百位数:1\d\d
    • 二百位数:200-255
      • 200-249:2[0-4]\d
      • 250-255:25[0-5]
    • reg = /^([0-9]|[0-9]\d|1\d\d|2[0-4]\d|25[0-5])$/
      1
      2
      3
      4
      var str = "23.49.157.213";

      var reg = /^([1-9]|[1-9]\d|[1]\d\d|2[01]\d|22[0-3])(\.([0-9]|[0-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}$/;
      console.log(str.match(reg));

邮箱匹配

1
2
3
var str = "0good_my@163.com.cn";
var reg = /^[a-zA-Z0-9][a-zA-Z0-9_\.]+@[0-9a-z]+(\.[a-z]+)+$/;
console.log(str.match(reg));

综上