简单了解正则表达式

156 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

正则表达式的创建方式

// 1. 字面量创建方式
var reg = /pattern/flags
// 2. 实例创建方式
var reg = new RegExp(pattern,flags)

pattern 正则表达式

flags 标识(修饰符)

    - i 忽略大小写匹配

    - m 多行匹配,即在到达一行文本末尾时还会继续寻常下一行中是否与正则匹配的项

    - g 全局匹配 模式应用于所有字符串,而非在找到第一个匹配项时停止

标识符

正则具有懒惰性,正则在成功捕获一次后不管后边的字符串有没有符合条件的都不在捕获。如果想捕获目标中所有符合条件的字符串的话,可以用标识符 g 来全局捕获。

字面量创建方式和构造函数创建方式的区别

字面量创建方式特殊含义的字符不需要转义,实例创建方式需要转义

var str = 'abc123de45fgh6789qqq111';
let reg1 = /\d/g;
let reg2 = new RegExp('\\d', 'g');
console.log('reg1---' + str.match(reg1)); // reg1---1,2,3,4,5,6,7,8,9,1,1,1
console.log('reg2---' + str.match(reg2)); // reg1---1,2,3,4,5,6,7,8,9,1,1,1

元字符

代表特殊含义的元字符

\d : 0-9之间的任意一个数字  \d只占一个位置
\w : 数字,字母 ,下划线 0-9 a-z A-Z _
\s : 空格或者空白等
\D : 除了\d
\W : 除了\w
\S : 除了\s
.  : 除了\n之外的任意一个字符
 \ : 转义字符
 | : 或者
() : 分组
\n : 匹配换行符
\b : 匹配边界 字符串的开头和结尾 空格的两边都是边界 => 不占用字符串位数
 ^ : 限定开始位置 => 本身不占位置
 $ : 限定结束位置 => 本身不占位置
[a-z] : 任意字母 []中的表示任意一个都可以
[^a-z] : 非字母 []中^代表除了
[abc] : abc三个字母中的任何一个 [^abc]除了这三个字母中的任何一个字符

代表次数的量词元字符

* : 0到多个
+ : 1到多个
? : 0次或1次 可有可无
{n} : 正好n次;
{n,} : n到多次
{n,m} : n次到m次

量词出现在元字符后面 如\d+,限定出现在前面的元字符的次数

正则中的 []

一般正则中的 [ ] 中的字符没有特殊含义,如+就表示+,但是像 \w 这样的还是有特殊含义的

var str1 = 'abc';
var str2 = 'dbc';
var str3 = '.bc';
var reg = /[ab.]bc/; //此时的.就表示.
reg.test(str1)  //true
reg.test(str2)  //false
reg.test(str3)  //true

[ ] 中不会出现两位数,[12] 表示1或者2,不过[0-9]这样的表示0到9,[a-z]表示a到z

例如:匹配从18到65年龄段多有的人,不能 var reg = /[18-65]/;这样写,实际上我们要拆开来匹配

let reg = /(18|19)|([2-5]\d)|(6[0-5])/g;
console.log(reg.test('17')); // false
console.log(reg.test('51')); // true

正则方法

reg.test(str)

用来验证字符串是否符合正则,符合返回true,否则返回false

var str = '123456';
var reg = /\w/g;
console.log(reg.test(str)); // true

reg.exec()

用来捕获符合规则的字符串

let str1 = 'abc123cba456aaa789';
let reg = /\d+/;
console.log(reg.exec(str1))
console.log(reg.lastIndex)
 // ["123", index: 3, input: "abc123cba456aaa789", groups: undefined]
 // 0:"123"  表示我们捕获到的字符串
 // index:3 表示捕获开始位置的索引
 // input 表示原有的字符串

str.match(reg)

如果匹配成功,就返回匹配成功的数组;如果匹配不成功,就返回null

//match和exec的用法差不多
var str = 'abc123cba456aaa789';
var reg = /\d+/;
console.log(reg.exec(str));
//["123", index: 3, input: "abc123cba456aaa789"]
console.log(str.match(reg));
//["123", index: 3, input: "abc123cba456aaa789"]

看上去,match和exec没有什么不同,但是当我们进行全局匹配时,二者的不同就显现出来了

var str = 'abc123cba456aaa789';
var reg = /\d+/g;
console.log(reg.exec(str));
// ["123", index: 3, input: "abc123cba456aaa789"]
console.log(str.match(reg));
// ["123", "456", "789"]

当全局匹配时,match方法会一次性把符合匹配条件的字符串全部捕获到数组中, 如果想用exec来达到同样的效果需要执行多次exec方法。

str.replace()

这个其实是字符串的方法,它可以传两个参数,第一个是 要替换掉的字符串,第二个是 用来替换的字符串。第一个参数可以传字符串也可以传正则。

var str = 'a111bc222de';
var res = str.replace(/\d/g,'Q')
console.log(res)
// "aQQQbcQQQde"

例子

var str = ' abc123_';
let reg1 = /^\s|\w$/g; // 匹配开头的空格 或 结尾的特殊字符
console.log(str.match(reg1)); // [' ', '_']
console.log(str.replace(reg1, '+')); // +abc123+
let reg = /foo(t|d)/;
console.log(reg.test('food')); // true
console.log(reg.test('foot')); // true
console.log(reg.test('fooq')); // false
let reg = /foo(t|d)/g; // 加上标识符 g
console.log(reg.test('foot')); // true
console.log(reg.test('food')); // false
console.log(reg.test('fooq')); // false
// 1. 匹配开头至少一个数字,结尾是abc的字符串
var str = "1abc";
var patt1 = /^[0-9]+abc$/;
console.log(patt1.test(str));

// 2. 匹配 3-15位的包含字符、数字、下划线
var str = "jingllifan";
var patt1 = /^[a-z0-9_-]{3,15}$/;
console.log(patt1.test(str));