原文:js 正则学习小记之匹配字符串

今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享。

关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配。(因为我想学完之后写个语法高亮练手,所以用js代码当作例子)
 var str1 = "我是字符串1哦,快把我取走", str2 = "我是字符串2哦,快把我取走"; 
比如这样一个字符串,匹配起来很简单 /"[^"]*"/g 即可。

PS: 白色截图是 chrome 34 控制台中运行的结果,深灰色是 sublime text 结果。

很容易就取到内容了,可是亲,你有没有想过,js字符串里允许转义。
 var str1 = "我是字符串1哦,\"快把我取走\"", str2 = "我是字符串2哦,\"快把我取走\"";

这不是我们想要的结果,所以我们要处理下转义问题。
转义的规则是 \ 后面跟着一个字符,所以我们用 \\. 去匹配它,就有了这样的正则 /"(?:\\.|[^"])*"/g

可能对于正则不熟悉的朋友,一下子从 /"[^"]*"/g 变到 /"(?:\\.|[^"])*"/g 后理解不了,我简单说明下。
(?:) 是非捕获组,就是不会把内容抓取保存到内存里的。
\\. 用于匹配 \" \' \a 之类的转义字符,匹配成功的话消耗2个字符。
[^"] 匹配除了 " 以外的所有字符,匹配成功的话消耗1个字符。
所以这个表达式的意思是,先匹配 \. 这样转义,如果成功会消耗掉正确的转义,如果不成功就用 [^"] 匹配。

消耗掉正确的转义的意思是,比如 "aa\\aa\"aa\ufffaa" 都会被正常匹配,因为这些都在正常的转义。
形如 "aa\\aa\"aa\ufff\\"aa" 这里的 \\" 其中 \\ 会被匹配,而 " 既不满足 \\. 也不满足 [^"]
所以这个匹配结果会是 "aa\\aa\"aa\ufff\\" 后面的 aa" 无法匹配到。

所以现在我们得到了比较强力的正则,可以有效的匹配 js 代码中的字符串了。

骚等,好像还有哪里不对。
js 字符串允许折行,形如这样:

var str = "大家好\
我是js";

但是这样的字符串用刚才的正则能匹配么?答案是能。
因为 \ 不能被 \\. 匹配,但是可以被 [^"] 匹配到,\ 后面一个字符是 \r, \n 或 \r\n (具体是什么换行符要看系统了) 都能被 [^"] 匹配到,所以我们无意间写了个强力的表达式。

现在剩下最后一个问题了,就是 ' 的匹配。
我们修改下表达式 /"(?:\\.|[^"])*"|'(?:\\.|[^'])*'/g 就好了。

来测试一下:

var str1 = "我是字符串1哦,\
\"快把我取走\"", str2 = '我是字符串2哦,\
\'快把我取走\'';

匹配成功。

好了,这些就是今天的分享了,明天见。

js 正则学习小记之匹配字符串相关推荐

  1. js 正则学习小记之左最长规则

    js 正则学习小记之左最长规则 原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'n ...

  2. 正则学习小记----1

    正则表达式 1. 基础知识 正则表达式是用于匹配字符串组合模式(增删改查),在js中表达式也是对象 拥有宿主环境才能运行 2. 示例展示 两种不同的表现形式 let hd = "dfsdfs ...

  3. 正则学习之量词匹配分析

    数量匹配自我分析: 1.?(匹配?前面的字符或者字符组出现0次或1次) 2.  +(匹配+前面的字符或者字符组出现1次或多次) 3. * (匹配*前面的字符或者字符组出现0次或者多次) 一.当我们匹配 ...

  4. js 正则练习之语法高亮

    js 正则练习之语法高亮 原文:js 正则练习之语法高亮 学了几天正则,差不多该总结整理写成果了,之前就想写语法高亮匹配来着,不过水平不够,看着例子都不理解. 今天就分析下 次碳酸钴 和 Barret ...

  5. 浅谈 js 正则字面量 与 new RegExp 执行效率

    前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化篇>. 里面讲到了优化正则起到提升性能的问题,但是能提升多少 ...

  6. php实训总结00字,说明的比较细的php 正则学习实例

    说明的比较细的php 正则学习实例 "^The": 匹配以 "The"开头的字符串; "of despair$": 匹配以 "of ...

  7. js 正则中冒号代表什么_JS正则表达式一条龙讲解(从原理和语法到JS正则)

    正则啊,就像一座灯塔,当你在字符串的海洋不知所措的时候,总能给你一点思路:正则啊,就像一台验钞机,在你不知道用户提交的钞票真假的时候,总能帮你一眼识别:正则啊,就像一个手电筒,在你需要找什么玩意的时候 ...

  8. js 正则中冒号代表什么_javascript中正则表达式语法详解

    好久都没有写博客了,主要是太懒了,尤其是在阳春三月,风和日丽的日子,太阳暖暖的照在身上,真想美美的睡上一觉.就导致了这篇博客拖到现在才开始动笔,javascript的正则这一块也不是什么新的东西,主要 ...

  9. Auto.js正则匹配字符串是否含有中文

    js正则匹配字符串是否含有中文 //验证字符串是否含有中文 function checkChinese(obj_val) {var reg = new RegExp("[\\u4E00-\\ ...

最新文章

  1. Java中的occur_time,PLSQL报错: ORA-12170:TNS connect timeout occurred
  2. CyAPI.lib(CyAPI.obj) : error LNK2019: 无法解析的外部符号...
  3. ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现
  4. C++标准库 第七章 STL迭代器
  5. 管理学习(2)——职场中最重要的四件事
  6. 基于依赖统计的方法——TPDA
  7. linux常用命令小结(二)
  8. python安装后怎样配解释器_入门Python第一步:如何安装Python解释器「新手必看」...
  9. 光棍节程序员闯关秀 小游戏
  10. react仿追书神器——哦豁阅读器
  11. 迈高图手机版_迈高图(地图数据下载器 ) V2.10.1.0 官方版-完美软件下载
  12. 技术规范,过几天发个压缩包,一次下载全部拥有
  13. 【利用EXCEL进行数据爬虫】数据爬虫学习
  14. 计算机网络编程(转载)
  15. 计算机主机异常经常蓝屏,电脑频繁蓝屏怎么办
  16. MSP430FR5994LannchPad开发笔记之三:MSP430的IO复用以及如何去获取IO复用功能
  17. hadoop2.4.1配置时出现域名解析失败的解决方法
  18. 2549. 【NOIP2011模拟9.4】家庭作业 (Standard IO)
  19. MAC Safari 浏览器自动重启,活动监视器闪退,CPU过高导致风扇嗡嗡响
  20. 【Flutter】----学习笔记1(1~5)

热门文章

  1. oracle 导数据报exp00058_一文看懂oracle12c数据库跨小版本迁移
  2. arduino上传项目出错_Arduino入门前你该知道的事儿
  3. python训练馆_Python训练营 01
  4. 计算机启动太慢可以设置什么来加速启动速度,电脑开机速度慢怎么办 如何加速电脑开机速度慢【详细介绍】...
  5. 计算机系统存数及取数方式,计算机系统结构总结2
  6. Docker镜像原理学习理解
  7. 大数据:Hive和Hbase的区别于优势
  8. 画架构图的软件_程序员为什么要学会画技术架构图?
  9. pythonjoin函数所在包_Python中的join()函数
  10. Linux下的top命令