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 正则学习小记之匹配字符串字面量的更多相关文章
- js 正则学习小记之匹配字符串字面量优化篇
昨天在<js 正则学习小记之匹配字符串字面量>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯后用 [^"] 才能匹配成功 ...
- js 正则学习小记之匹配字符串
原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...
- js 正则学习小记之匹配字符串优化篇
原文:js 正则学习小记之匹配字符串优化篇 昨天在<js 正则学习小记之匹配字符串>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯 ...
- js 正则学习小记之左最长规则
原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'nfa'.其实我们的本意是想得到整 ...
- js 正则学习小记之NFA引擎
原文:js 正则学习小记之NFA引擎 之前一直认为自己正则还不错,在看 次碳酸钴,Barret Lee 等大神都把正则玩的出神入化后发现我只是个战五渣. 求抱大腿,求大神调教. 之前大致有个印象,正 ...
- 【译】Java中的字符串字面量
原文地址:https://javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html 作者:Corey McGlone 让我们由一个简 ...
- char型指针和字符串字面量和字符数组
1.当一个char型指针指向一个字符串字面量(也就是常量字符串)时,该指针必须由const修饰,否则,系统会给出deprecated(不赞成)的警告.原因是:字符串字面量不可改变,当它被一个非cons ...
- C内存对齐问题-bus error!总线错误!其实是 字符串字面量修改问题!
最近写个小程序,出现bus error! int main(void) { /** * char :1个字节 * char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也 ...
- c#字符串字面量
分为两种: 1 常规字符串字面量 2逐字字面量字符串:以@字符为前缀.注意:注意逐字字面量唯一例外的是相邻的双引号组,它们被解释为单个双引号字符.
随机推荐
- centos7 php性能调优
php-ini优化 vi /etc/php.ini 打开php的安全模式,控制php执行危险函数, 默认是Off,改为On sql.safe_mode = Off 关闭php头部信息, 隐藏版本号, ...
- DFA化简
首先是未化简DFA的转换表 NFA状态 DFA状态 a b {0,1,2,4,7} A B C {1,2,3,4,6,7,8} B B D {1,2,4,5,6,7} C B C {1,2,4,5,6 ...
- MongoDB作为Windows服务来安装 错误1053:服务没有及时响应启动或控制请求
这个问题我解决了一晚上,用尽了所有百度 博客上的方法,都是失败的 结果重新换了一种安装的方法 视频讲解 非常清楚 https://www.bilibili.com/video/av31240330? ...
- 《Linux内核分析》第三周学习笔记
<Linux内核分析>第三周学习笔记 构造一个简单的Linux系统MenuOS 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.stud ...
- 团队项目7——团队冲刺beta版本目录
Beta版本冲刺计划及安排http://www.cnblogs.com/zy-96/p/8017331.html 第二次项目冲刺(Beta版本12.04) www.cnblogs.com/zy-96/ ...
- vm15安装esxi6.0
vmware 15安装esxi6.0时发现出现没有硬盘选择,导致无法安装 在vm12上安装正常 经过测试 1.需要在虚拟机硬件兼容性上选择12.x 2.版本也要选6.0,不要选6.X 其次,esxi要 ...
- psp进度统计
每周例行报告 本周PSP 类别 任务 开始时间 结束时间 被打断时间 总计工作时间 11月8日 代码 参与团队项目 10:13 11:30 0 77min 写博客 词频统计总结 13:35 14 ...
- java词频统计——web版支持
需求概要: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件. 2.用户直接输入要统计的文本,服务器返回结果 3.在页面上给出链接 (如果有封皮.作者.字数.页数等信息更佳)或表格,展示经 ...
- Oracle Profile 的简单说明
1. 查看已经有的oracle 的profile 首先profile的解释 我理解为 是一个 简略的配置文件, 跟linux的 bash文件的配置信息类似 bash_profile . select ...
- 实现AJAX的基本步骤
实现AJAX的基本步骤 要完整实现一个AJAX异步调用和局部刷新,通常需要以下几个步骤: (1)创建XMLHttpRequest对象,也就是创建一个异步调用对象. (2)创建一个新的HTTP请求,并指 ...