JS—正则表达式(b)

正则表达式的元字符是包含特殊含义的字符,它们有一些特殊的功能,可以控制匹配模式的方式,反斜杠后的元字符失去其特殊含义。

  • 单个字符和数字

  • .表示匹配除换行符外的单个字符,两个.就表示匹配两个字符
    var pattern1=/g.gle/;
    alert(pattern1.test('gogle'))//true
    alert(pattern1.test('g\ngle'))//换行符false
    alert(pattern1.test('ggle'))//没有匹配false
    var pattern2=/g..gle/;
    alert(pattern2.test('google'))//true
    alert(pattern2.test('gooogle'))//false

  • [a-z0-9A-Z]

    • [a-z] 表示26个小写字母任意一个都匹配
      var pattern1=/[a-z]oogle/;
      alert(pattern1.test('hoogle'))//true
      alert(pattern1.test('google'))//true
    • [A-Z] 表示26个大写字母任意一个都匹配
      var pattern1=/[A-Z]oogle/;
      alert(pattern1.test('Aoogle'))//true
      alert(pattern1.test('google'))//false
    • [0-9] 表示0-9任意一个数字都匹配
      var pattern1=/[0-9]oogle/;
      alert(pattern1.test('000000oogle'))//true
      alert(pattern1.test('google'))//flase
    • [a-zA-Z0-9] 表示匹配任意字母与数字
      var pattern1=/[a-zA-Z0-9]oogle/;
      alert(pattern1.test('0oogle'))//true
      alert(pattern1.test('google'))//true
      alert(pattern1.test('Foogle'))//true
      【结合重复字符使用】表示可以匹配任意多个字符
      var pattern1=/[0-9]*oogle/;
      alert(pattern1.test('oogle'))//true
      alert(pattern1.test('00000google'))//true
  • [^a-z]表示取非,任意非小写字母
    var pattern1=/[^a-z]oogle/;
    alert(pattern1.test('0oogle'))//true
    alert(pattern1.test('google'))//flase
    alert(pattern1.test('Foogle'))//true
    当然也可以是任意非大写字母,非数字,非~

  • \w小写表示匹配字母数字及_
    var pattern1=/[a-zA-Z0-9_]oogle/;//可以被后者取代
    var pattern2=/\woogle/;
    alert(pattern2.test('_oogle'))//true
    alert(pattern2.test('.oogle'))//false

  • \W大写是小写的否定即,表示匹配任意非数字字母下划线

  • \d匹配数字
    var pattern1=/[0-9]oogle/;
    var pattern2=/\doogle/;
    alert(pattern2.test('2oogle'))//true
    alert(pattern2.test('.oogle'))//false

  • \D大写取非咯

  • 空白字符

  • \s表示空白匹配
    var pattern1=/goo\sgle/;
    alert(pattern1.test('goo gle'))//true

  • 锚字符

  • ^[]放在中括号外面哦,表示限制中括号内的内容出现在字符串的开始,

  • []$表示限制中括号的内容,或紧邻其的一个字符需要出现在字符串的结尾
    var pattern1=/^google$/;
    alert(pattern1.test('google'))//true
    var pattern2=/^google/;
    alert(pattern2.test('googleeeeee'))//true
    var pattern3=/google$/;
    alert(pattern3.test('gggggoogle'))//true
    var pattern1=/^google[0-9]$/;
    alert(pattern1.test('google7777'))//false
    alert(pattern1.test('google7'))//true

  • \b表示是否达到边界
    var pattern1=/google\b/;
    alert(pattern1.test('google'))//true
    var pattern1=/google\b/;
    alert(pattern1.test('googlee'))//flase

  • 重复字符

  • *表示匹配0个或任意多个前面的字符
    var pattern1=/go
    gle/;
    alert(pattern1.test('ggle'))//true
    alert(pattern1.test('gogle'))//true
    alert(pattern1.test('gooogle'))//true

  • +表示匹配1个或多个+前面的字符
    var pattern1=/go+gle/;
    alert(pattern1.test('ggle'))//false
    alert(pattern1.test('gogle'))//true
    alert(pattern1.test('gooogle'))//true

  • 表示匹配0个或一个?前面的字符
    var pattern1=/go?gle/;
    alert(pattern1.test('ggle'))//true
    alert(pattern1.test('gogle'))//true
    alert(pattern1.test('gooogle'))//false
    这个是表示对任意字符的重复限制。
    var pattern1=/g.?gle/;
    alert(pattern1.test('ggle'))//true
    alert(pattern1.test('gbgle'))//true

  • {m,n}匹配m~n个包括m与n个
    var pattern1=/go{2,4}gle/;
    alert(pattern1.test('gooooogle'))//false
    alert(pattern1.test('google'))//true
    表示只匹配限定个数个
    var pattern1=/go{2}gle/;
    alert(pattern1.test('gooooogle'))//false
    alert(pattern1.test('google'))//true
    表示至少匹配某个
    var pattern1=/go{2,}gle/;
    alert(pattern1.test('gooooogle'))//true
    alert(pattern1.test('google'))//true

  • ()+匹配至少一个模式
    var pattern1=/(google)+/;//对google这个字符串进行重复匹配
    alert(pattern1.test('googlegooglegoogle'))//true

  • 或字符
    或模式匹配
    var pattern1=/google|baidu|bing/;//或模式匹配
    alert(pattern1.test('this is baidu'))//true
    alert(pattern1.test('soso'))//false

  • 替代字符
    var pattern1=/(.)\s(.)/;//替换
    var str='google baidu';
    alert(str.replace(pattern1,'$2 $1'));//baidu google
    var pattern1=/8(.*)8/;//获取88之间的任意字符
    var str='this is 8google8';
    document.write(str.replace(pattern1,'<strong>$1</strong>'))

  • 记录字符

    • 分组
      var pattern1=/(google){2,4}/;//对google这个字符串进行重复匹配
      alert(pattern1.test('googlegooglegoogle'))//true
      alert(pattern1.test('google'))//flase
    • 捕获分组
      var pattern1=/8(.*)8/;//获取88之间的任意字符
      alert(pattern1.test('this is 8google8'))//true
      alert(RegExp.$1);//google表示获取模式中第一个分组对应的匹配的字符串,必须得运行过。

贪婪与惰性

  • 贪婪模式
    var pattern=/8(.*)8/;// 使用了贪婪,匹配到了google8 8google8 8google
    var str='8google8 8google8 8google8';
    document.write(str.replace(pattern,'<strong>$1</strong>'))
  • 惰性模式
    var pattern=/8(.?)8/g;//惰性模式,全部匹配
    var str='8google8 8google8 8google8';
    document.write(str.replace(pattern,'<strong>$1</strong>'))
    后面多加一个?表示取消贪婪模式,进行惰性模式,只进行匹配一个。
    下面这个是没有采用惰性模式,只是将匹配的结果中除去了8
    var pattern=/8([^8]*)8/g;//惰性模式,全部匹配
    var str='8google8 8google8 8google8';
    document.write(str.replace(pattern,'<strong>$1</strong>'))

  • 捕获与非捕获
    未添加分组时:.exec只返回当前位置匹配的字符串
    var pattern=/[a-z]\s\d{4}/;
    var str='google 2015';
    alert(pattern.exec(str));//google 2015
    添加分组后,该分组内容被捕获,并赋给exec所返回的数组
    var pattern=/([a-z]
    )\s(\d{4})/;
    var str='google 2015';
    alert(pattern.exec(str));//google 2015,goole,2015
    非捕获即取消分组被捕获(?:)通过在分组前加上问号与冒号,便可以取消捕获该分组。
    var pattern=/([a-z]*)\s(?:\d{4})/;
    var str='google 2015';
    alert(pattern.exec(str));//google 2015,goole

  • 分组嵌套
    嵌套分组需要从外往内获取
    var pattern=/(a?(b?(c?)))/;
    var str='abc';
    alert(pattern.exec(str));//abc,abc,bc,c
    第一步:获得匹配字符串:abc
    第二步:获得第一个分组,即最外层:abc
    第三步:获得第二个分组,bc
    第四步:获得最内层分组c

  • 使用前瞻捕获
    var pattern=/goo(?=gle)/;
    var str='google';
    alert(pattern.exec(str));//goo
    在正则匹配的字符串之后添加一对(),该括号内定义了匹配条件,只有当满足条件时,才可以进行匹配。注意该例子的最后匹配值为goo。

  • 使用特殊字符匹配
    var pattern=/[/;
    var str='[';
    alert(pattern.test(str));//true
    对于要匹配特殊最的情况,需要在其前加上斜杠,来标识。

  • 换行模式
    var pattern=/\d+/g;
    var str='1、abc\n2、edf';
    alert(str.replace(pattern,'#'));//完全匹配,并替换

      var pattern=/^\d+/g;
      var str='1、abc\n2、edf';
      alert(str.replace(pattern,'#'));//匹配第一个
      
      var pattern=/^\d+/gm;
      var str='1、abc\n2、edf';
      alert(str.replace(pattern,'#'));//完全匹配,并替换
    

当字符串内出现换行符时,如果我们不进行锚字符的使用,那么会匹配全局,包括换行后的。
但是,由于使用锚字符,导致即使使用了全局,也没有办法匹配换行后的结果,此时需要开启换行。

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

推荐阅读更多精彩内容

  • 什么是正则表达式?如何创建正则表达式正则表达式常用的方法字符串中的正则表达式常用的正则表达式假设用户需要在HTML...
    greenlift阅读 773评论 0 0
  • 正则表达式是一个描述字符模式的对象,ECMAScript的RegExp类表示正则表达式。String与RegExp...
    Miss____Du阅读 767评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,105评论 18 139
  • RegExp 三大方法本文的RegExp采用直接量语法表示:/pattern/attributes。attribu...
    恩德_b0c2阅读 420评论 0 0
  • 我是一只小小鸟,想要飞却飞不高。 我是一个大肚子,想要减却减不掉。
    画痴NOV阅读 285评论 0 1