JS正则表达式

前言

关于正则表达式,一直以其难学程度且适用场景有限而敬而远之,偶然看到一篇关于正则的文章,产生兴趣,因此记录一下学习笔记,方便日后查阅。

一、正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑,许多程序设计语言都支持利用正则表达式进行字符串操作。

主要有两种操作:匹配和捕获

正则表达式的创建:
正则表达式是有元字符和修饰符组成,将元字符和修饰符写在/ /

基础笔记:

元字符:
\: 转义字符
^: 以某一个元字符开始
$: 以某一个元字符结束
\n: 匹配一个换行
.:除了\n以外的任意字符
(): 分组
x|y: x或者y中第一个
[xyz]:x或者y或者z中的一个
[^xyz]:除了三个以外的任意一个字符
[a-z]:a 和 z 之间的任意字符
[^a-z]:除了a 和 z 之间的任意字符
\d:表示 0-9 之间的数字
\D:除了0-9之间的数字以外的任意字符
\b:匹配一个边界符 w1 w2
\w:数字、字母、下划线中的任意字符 [0-9a-zA-Z_]
\s:匹配一个空白字符 空格、一个制表符、换页符...

二、正则精准匹配

精准匹配是指匹配字符串中的某个子串,使用test()方法,匹配某个模式,返回true/false

  • 单个匹配模式
let testString = 'test string,for reference only';
let testRegex = /reference/;
let testResult = testRegex.test(testString);
console.log(testResult);     //true
  • 多个匹配模式
    使用操作符号 |匹配多个字符串
let testString = 'test string,for reference only';
let testRegexMore = /test|for|only/;
let testMore = testRegexMore.test(testString);
console.log(testMore);      //true

三、模糊匹配

精准匹配只能匹配字符串中的某个子串,正则表达式之所以强大,是因为其能实现模糊匹配,满足更多的应用场景,使用match()完成

console.log('Cad cAd caD CAd CaD cAD'.match(/cad/gi));  
// [ 'Cad', 'cAd', 'caD', 'CAd', 'CaD', 'cAD' ]
  • 匹配任意字符
    正则使用.完成任意字符的匹配
console.log('Cad cAd caD CAd CaD cAD'.match(/.ad/gi));
// [ 'Cad', 'cAd', 'caD', 'CAd', 'CaD', 'cAD' ]
  • 匹配数量

量词元字符(数量元字符)
* :出现零到多次
+:出现一到多次
:出现零次或者一次
{n}:出现 n 次
{n,}:出现 n 到多次
{n,m}:出现 n 到 m 次

标志字符
g:全局搜索,记忆方式 global
i:不区分大小写,记忆方式 ignore
m:多行搜索

1. 出现零到多次

console.log('hi'.match(/hi*/gi));    //[ 'hi' ]
console.log('hiiiiiiii'.match(/hi*/gi));   //[ 'hiiiiiiii' ]
console.log('hiihihi'.match(/hi*/gi));   //[ 'hii', 'hi', 'hi' ]

2. 出现一到多次

let matchMoreStr = "Tallahassee";
console.log(matchMoreStr.match(/s+/gi));     // [ 'ss' ]
console.log(matchMoreStr.match(/a+/gi));     //[ 'a', 'a', 'a' ]

3. 出现零次或者一次

console.log((/colou?r/i).test('colour'));   // true
console.log((/colou?r/i).test('Color'));     // true
console.log((/colou?r/i).test('Colouuur'));     // false

4. 出现指定次数

let matchStr = "cde cdde cddde cdddde cddddde";
let matchReg = /cd{3,5}e/g;
console.log(matchStr.match(matchReg));      // [ 'cddde', 'cdddde', 'cddddde' ]
console.log(matchStr.match(/cd{1}e/g));       // [ 'cde' ]
console.log(matchStr.match(/cd{1,}e/g));      // [ 'cde', 'cdde', 'cddde', 'cdddde', 'cddddde' ]
  • 匹配一组字符
    使用[]匹配一组字符
console.log('bat cst sat dat eat at act'.match(/[bde]at/gi));     // [ 'bat', 'dat', 'eat' ]
console.log('bat cst sat eat dat at act'.match(/[a-e]at/gi));     // [ 'bat', 'eat', 'dat' ]
  • 匹配一组不想拥有的字符
    匹配不想拥有的一组字符,需要使用否定字符集^
let notVowels = /[^aeiou]/gi;
console.log('nameasasasasa'.match(notVowels));   // [ 'n', 'm', 's', 's', 's', 's' ]
  • 匹配字母
console.log('Bat cst sat eat dat at act'.match(/[a-z]at/g));    // [ 'sat', 'eat', 'dat' ]
console.log('Bat cst sat eat dat at act'.match(/[A-Z]at/g));    // [ 'Bat' ]
console.log('Bat cst sat eat dat at act'.match(/[a-zA-Z]at/g));   //[ 'Bat', 'sat', 'eat', 'dat' ]=
  • 匹配数字/非数字
    可以使用字符集[0-9],或者使用简写\d
    \D表示 \d的反义
console.log('Bat1929287373 cst sat eat dat at act'.match(/[0-9]/g));    
// [ '1', '9', '2', '9', '2', '8', '7', '3', '7', '3' ]

console.log('Bat1929287373 cst'.match(/\D/g));
// [ 'B', 'a', 't', ' ', 'c', 's', 't' ]
  • 匹配所有的字母和数字
    可以使用\word 简写,\w
console.log(/[A-Za-z0-9_]+/.test('42asas'));
console.log(/\w+/.test('name32'));
  • 匹配所有的非字母和非数字
    \W表示\w的反义
console.log(/\W+/g.test('%^^&'));
console.log(/\W+/.test('name32'));

-匹配空格/非空格
使用 \s来匹配空格和回车符
\S表示\s的反义

console.log('Love you three thousand'.match(/\s/g));    //[ ' ', ' ', ' ' ]
console.log('Love you three thousand'.match(/\S/g));
// [ 'L', 'o','v', 'e','y','o','u','t','h','r','e','e','t','h','o','u','s','a','n','d' ]
  • 匹配起始字符串
    匹配起始字符串,使用插入符号^,但要放到开头,放到字符集中间匹配不到
console.log('Love you three thousand'.match(/^Love/g));    //[ 'Love' ]
console.log('Love you three thousand'.match(/^you/g));     //null
  • 匹配结束字符串
    使用$来判断字符串是否是以规定的字符结尾
console.log('Love you three thousand'.match(/thousand$/g));    //[ 'thousand' ]
console.log('Love you three thousand'.match(/three$/g));    //null

四、惰性匹配

默认情况下,正则表达式是贪婪的(匹配满足给定要求的字符串的最长部分),但是一般情况下,我们只需要字符串中与给定要求匹配的最小部分,因此需要阻止正则表达式的贪婪匹配
使用 ?阻止贪婪模式(惰性匹配 )

console.log('catnamebatdat'.match(/c[a-z]*t/gi));     //[ 'catnamebatdat' ]
console.log('catnamebatdat'.match(/c[a-z]*?t/gi));    //['cat' ]

你可能感兴趣的:(JS正则表达式)