正则表达式

118 阅读4分钟

正则表达式

语法 :/正则表达式主体/修饰符(可选)

pattern 模式

- 正则表达式主体

修饰符

- i 忽视大小写
- g 全局匹配 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
- m 换行匹配(多行匹配)

创建正则表达式的方式

使用new

var box = new RegExp("box"); //传入非空字符串 
console.log(box);   // /box/
console.log(typeof box); //object

var box = new RegExp("box", "gi");  //,第一个参数是模式,第二个参数是修饰符
console.log(box); // /box/gi

字面量

var box = /box/;
console.log(box);   // /box/
console.log(typeof box); //object
			
var box = /box/gi;
console.log(box); // /box/gi

正则符号

基本元字符

.逗号:任意字符

\d:数字

\D:非数字

\s:空白(空格、缩进、换行(换行符\n))

\S: 非空白

\w:字母、数字、下划线

\W:非(字母、数字、下划线)

\ 转义字符

边界符

限制字符串开头和结尾必须是一个什么字符

  • ^ 开头 var reg = /^\d/

  • $ 结尾 var reg = /\d$/

  • [^$] 开头结尾组合使用 var reg = /^abc$/

限定符

【注】只限定,限定符前面的一个字符

  • * 0~n次

  • + 1~n次

  • ? 0~1次

  • {n} 指定次数

  • {n,} 大于等于n次

  • {n,m} n~m次

特殊符号

  • ()表示一个整体

  • |【注】整体 | 整体

  • []-([]里面的-取范围用)

  • [^] 取反

正则表达式的使用

  • . (逗号)表示一个任意字符
var reg = /g..gle/;
var str = "gadgle";
console.log(reg.test(str));
  • * 表示次数,0次 或是 多次
  • .* 任意字符可以出现任意次数
var reg = /g.*gle/;
var str = "gfjsljflksdjflksdjfgle";
console.log(reg.test(str));
  • [] 表示字符可以出现的范围,一个中括号表示一个字符
var reg = /g[a-z]gle/; //范围是a-z
var str = "gagle";
console.log(reg.test(str));
  • [abc] 表示范围只能是a 或b 或c
var reg = /g[abc]gle/;
var str = "gbgle";
console.log(reg.test(str));
  • [^a-z] 在括号内部出现的^取反,不是a-z
var reg = /g[^a-z]+gle/
console.log(reg.test("g12341234gle"));
  • + 表示次数,1次或多次
var reg = /g[a-z]+gle/
console.log(reg.test("gdddddagle"));
  • ? 表示次数 0次 或是 1次
var reg = /g[a-z]?gle/
console.log(reg.test("gagle"));

-\w 等于 [a-zA-z0-9_] 匹配字母数字下划线

var reg = /g\w+gle/
console.log(reg.test("ga0_gle"));
  • \W等于 [^a-zA-Z0-9_]匹配非字母数字下划线
var reg = /g\W+gle/
console.log(reg.test("g!*()gle"));
  • \d[0-9] 匹配数字

var reg = /g\d+gle/
console.log(reg.test("g123415gle"));
  • \D [^0-9] 匹配非数字

var reg = /g\D+gle/
console.log(reg.test("ga_gle"));
  • \s 匹配空白

var reg = /g\s+gle/
console.log(reg.test("g  gle"));
  • \S 匹配非空白

var reg = /g\S+gle/
console.log(reg.test("gafdfgle"));
  • {n} 固定n次
var reg = /g[a-z]{2}gle/;
console.log(reg.test("gafgle"));
  • {n,m} 最少n次,最多m次
var reg = /g[a-z]{2,5}gle/;
console.log(reg.test("gafssgle"));
  • {n,} 最少n次,最多不限
var reg = /g[a-z]{2,}gle/;
console.log(reg.test("gaffajdklfjadjfkadfgle"));
  • /^ 匹配开头,从头开始匹配
var reg = /^google/;
console.log(reg.test("google12341234"));
  • $/ 匹配结尾,从结束开始匹配
var reg = /google$/;
console.log(reg.test("1345google"));
  • |使用或模式进行匹配 匹配其中一种字符串
var reg = /ab|db|bc/;
console.log(reg.test("ab"));
  • ()分组模式匹配 整体() 小括号里面的东西可以被当成一个整体
var reg = /(google){4,8}/
console.log(reg.test("googlegooglegooglegooglegooglegooglegooglegoogle"));
  • 获取8..8之间的任意字符
var reg = /8(.*)(gg)8/;
var str = "this is 8google8 baab 8ggg8";
console.log(str.match(reg));
console.log(RegExp.$1); //匹配(.*)的内容
console.log(RegExp.$2); //匹配(gg)的内容
  • 使用特殊字符匹配 \ 转义符,可以将本来有语义的字符没有语义,
var str = ".[/b]"
var reg = /\.\[\/b\]/;
console.log(reg.test(str));

捕获性分组 和 非捕获性分组

  • 捕获性分组
  • 先满足捕获满足的(\d+)([a-z]),再捕获满足(\d+)和([a-z]),贪婪
var reg = /(\d+)([a-z])/;
console.log(reg.exec("123abc"));
  • 非捕获性分组
  • 给()中加上?: 让捕获不贪婪,只捕获(\d+)([a-z])条件的
var reg = /(?:\d+)(?:[a-z])/;
console.log(reg.exec("123abc"));

正则的方法(2个)

test() 条件满足,返回true,否则返回false

var reg1 = /abc/i;  //如果加了修饰符g,第2次匹配会接着上一次的结束的地方开始
console.log(typeof reg); //reg 是一个对象
console.log(reg1.test("helloabcworld"));

exec() 条件满足,匹配出符合正则表达式的值,返回数组,不满足返回null

var reg1 = /abc/i;  //如果加了修饰符g,第2次匹配会接着上一次的结束的地方开始
console.log(typeof reg);
console.log(reg1.exec("helloabcworld"));

字符串支持正则的方法(4个)

serach() 条件满足返回下表,不满足返回-1

    var str = "abcabcabc";
    console.log(str.search("bca"));

match() 条件满足返回数组,条件不满足返回null

    console.log(str.match("ca"));

split() 切割 返回数组

    console.log(str.split("ca"));

replace() 替换 返回字符串

    console.log(str.replace("ca","aaa"));