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' ]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容

  • 正则表达式功能: 测试字符串的某个模式。例如对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信...
    DecadeHeart阅读 605评论 0 1
  • 作为一名攻城狮,对正则表达式一定不会很陌生,但在平时开发中有时依然会遇到这样或那样的问题。本文从基础出发,本着让初...
    艾特TT阅读 2,020评论 3 12
  • 第一部分 基础知识 一、正则申明方式 1、构造函数方式 ● 通过 new 构造一个正则表达式对象,其中第一个参数 ...
    _双眸阅读 26,796评论 2 15
  • JavaScript-正则表达式 记录这篇高大上的正则表达式,其实接触很多,但是实际项目里面感觉运用的比较少呀,用...
    明明三省阅读 3,035评论 0 24
  • 一、匹配符 \:指出接着的字符为特殊字符。 ^:表示匹配的字符必须在最前边。 $:表示匹配的字符必须在最后边。 *...
    活叁黄辉冯阅读 780评论 0 3