正则表达式详解

注意:

  • 匹配了的项不会再匹配了
  • 空格也参与匹配
  • 如果加了^和$则是匹配字符串从而得出true or false(对给定的字符串只匹配一次)
  1. 什么是正则表达式

    正则表达式是由一个字符序列形成的搜索模式。

    当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。

    正则表达式可以是一个简单的字符,或一个更复杂的模式。

    正则表达式可用于所有文本搜索(search方法)和文本替换(replace方法)的操作。

    语法

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

    修饰符:

    i 不区分(ignore)大小写
    例如: /abc/i 可以匹配 abc、aBC、Abc


    g 全局(global)匹配
    如果不带g,正则过程中字符串从左到右匹配,找到第一个符合条件的即匹配成功,返回
    如果带g,则字符串从左到右,找到每个符合条件的都记录下来,直到字符串结尾位置
    例如:
    var str = 'aaaaaaaa'
    var reg1 = /a/; str.match(reg1) // 结果为:["a", index: 0, input: "aaaaaaaa"]
    var reg2 = /a/g; str.match(reg2) // 结果为:["a", "a", "a", "a", "a", "a", "a", "a"]


    m 多(more)行匹配
    若存在换行\n并且有开始^或结束 (美元符) 符的情况下,和 g一起使用实现全局匹配,
    因为存在换行时默认会把换行符作为一个字符任务匹配字符串是个单行,
    g只匹配第一行,添加m之后实现多行,每个换行符之后就是开始
    var str = "abcggab\nabcoab";
    var preg1 = /^abc/gm; str.match(preg1) // 结果为:["abc", "abc"]
    var preg2 = /ab$/gm; str.match(preg2) // 结果为:["ab", "ab"]


    s 特殊字符圆点 . 中包含换行符
    默认的圆点 . 是 匹配除换行符 \n 之外的任何单字符,加上s之后, . 中包含换行符
    $ str = "abggab\nacbs";
    $ preg = "/b./s";
    preg_match_all($preg, $str,$matchs);
    print_r($matchs);//Array ( [0] => Array ( [0] => bg [1] => b [2] => bs ) )


    U 只匹配最近的一个字符串;不重复匹配;
    $mode="/a(.*?)c/";
    $preg="/a.*c/U";//这两个正则返回相同的值
    $str="abcabbbcabbbbbc" ;
    preg_match($mode,$str,$content); echo $content[0];//abc
    preg_match($preg,$str,$content); echo $content[0];//abc
    //修正符:x 将模式中的空白忽略;
    //修正符:A 强制从目标字符串开头匹配;
    //修正符:D 如果使用$限制结尾字符,则不允许结尾有换行;
    //修正符:e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;

注意:上面主要使用search()方法和replace()方法,也能用test()方法

search() 方法
用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。
var str = "Visit Runoob!";
var n = str.search("Runoob");

replace() 方法
用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
str='Visit Microsoft'
str.replace(/microsoft/i,'Runoob') //使用Runoob 代替 str 中的Microsoft字符串</pre>


注意:下面的写法 被称为 正则表达式模式

使用方法有两个:

  1. test()

    test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。

    const pat1=new RegExp('e') //是否有字母e

    pat1.test('the best thing') //true

  2. exec()

    exec() 方法用于检索字符串中的正则表达式的匹配。

    该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

    const pat1=new RegExp('e') //是否有字母e

    pat1.exec('the best thing') //返回了 要找的内容 e

  3. 正则表达式的元字符

图片1.png

注意: ^ 在 [ ] 中是取反的意思,在外面是匹配字符串的开始的意思

^.{2}$ 表示匹配两个除了\以外字符组成的字符串

[^aeiou] 表示除了aeiou以外的字符

  1. 反义(将小写变成大写即可)

图片2.png

[ aeiou] ID 表示 可以是[ ]中的任意一个再加上 ID 组成的字符

3.转义

问题: 如何匹配特殊字符呢 ? 如 ‘ . ’ ,' ? '等

答:使用转义符 【 \ 】,如 \ . , \ ?

  1. 正则表达式的注释

图片3.png

5.正则表达式的重复

图片4.png

例如:

?表示 有没有,+ 表示要不要在加几个 ,* 表示任意个,没有限制

zo* 表示可以匹配 z 或者 zoo

\ d{8} 表示 匹配 8位的数字

6.分支条件

图片5.png

例子

如 ^ 0\d{2,3}-\d{8} | 0\d{3}-d{7} $

021-1234567 true

023-12345678 true

023-123456789 false,后半段数字的长度只能是7或者8位,其中 …^ 表示开始, $表示结尾

\d{2,6} 表示2到6位数字

7.分组:()

作用:将子表达式做成子集,方便对匹配的字符进行划分

符号 :()

例子:

(\d{1,3} \ .){3}\d{1,3} 匹配IP地址

其中 \d {1,3} 表示 可以是 1-3个数字

图片6.png

8.贪婪和懒惰

  • 贪婪 : .*

    作用: 比如 <a.*> ,如果一个页面中有多个< a>标签,则会将第一个< a > 一直到最后一个< a> 看成是一个结果找出

    理解:

    ' . ' 代表 匹配除了 换行符 以外的所有字符

    ‘ * ’ 代表 出现次数为 零次到无限次

    ‘ .* ' 表示 除了换行符的字符 出现零次到无限次

  • 懒惰 :.*?

    作用:比如 < a .*>,如果一个页面中有多个 < a > 标签,则会将每一个 < a>标签看成一个结果,如果有n个 ,则会有n个结果

    理解:

    ’ ?' 代表 出现零次或者一次(尽量匹配少的内容,最简短的那个)


    例子:

    当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

    有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:

    a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)

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

推荐阅读更多精彩内容

  • 概述 正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配、替换、截取匹配的字符串。常用的语...
    醉于麦田阅读 494评论 0 0
  • 正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配、替换、截取匹配的字符串。常用的语言基本...
    极客小寨阅读 331评论 0 0
  • 因为比较重要,所以还是单独拿出来作一篇文章,好好学习一下。 正则表达式:Regular expression 定义...
    齐舞647阅读 1,000评论 3 7
  • #首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用法 环视用法...
    mapuboy阅读 1,605评论 0 51
  • JavaScript-正则表达式 记录这篇高大上的正则表达式,其实接触很多,但是实际项目里面感觉运用的比较少呀,用...
    明明三省阅读 3,029评论 0 24