浅析JavaScript字符串中的引号与反斜杠

最近在看《JavaScript语言精粹》这本书,读到了正则表达式一章,文中提及一个匹配JavaScript字符串的正则表达式对象,当我发现他的正则表达式的时候我就不淡定了,预感到自己要深陷其中了。

var my_regexp = /"(?:\\.|[^\\\"])*"/

我在研究这个正则表达式的过程中发现了自己的很多知识盲区,下面通过介绍这个正则表达式将知识内容一一列举出来。

声明字符串时的反斜杠和引号

声明字符串时,如果字符串内容中包含 ‘/’ 或者 引号的时候是需要特别注意的。

反斜杠

如果你想声明一个表示window路径的字符串,比如C盘的根路径,你可能想这样写,但是相应的控制器会给你报出错误:

var str = 'c:\'   // Uncaught SyntaxError: Invalid or unexpected token

什么意思呢?字面意思是你这个字符串没写完。表达式中后面的引号 '被转义了,他表示这个引号是ASCII 字符,不作为语法用途,你可能会想这样写来让他不报错,可以发现,打印出来的结果并不是我们想要得到的:

var str = 'c:\''    // str -- "c:'"

正确的理解方式应该是将\反斜杠进行转义,保证我们想要的只是一个表示ASCII字符的反斜杠。正确的写法应该是:

var str = 'c:\\'   // str -- "c:\"
引号

javascript有一个有意思的地方就是,用户声明一个字符串,可以使用单引号也可以使用双引号。, 比如声明一个字符串,i am at Lily's house,此时如下方的写法,他会将之前的引号作为字符串的结尾:

var str1 = 'i am at Lily's house'  // Uncaught SyntaxError: Unexpected identifier
var str1 = "i am at Lily's house"  // str1 -- "i am at Lily's house"

所以,要将 '进行转义:

var str1 = 'i am at Lily\'s house'  // str1 -- "i am at Lily's house"

正则表达式中的反斜杠和引号

这里我们只谈使用字面量的方式来创建一个正则表达式的方式。当我们想去匹配一个字符串内容时,正则表达式中的反斜杠不可以直接写出,需要有一个反斜杠来帮助转义,也就是在正则表达式字面量中,想匹配反斜杠的内容,比如匹配\James\ ,正则表达式要这样写

var regexp = /^\\\w+\\$/; 
// 当然了,测试字符串是否匹配的时候我们也要转义一下字符串的反斜杠
regexp.test('\\James\\') // true

本书中给出的例子我研究了很久,事实证明正则表达式中的引号,其实是没有必要去专门转义的,如果想匹配引号,直接写引号即可。从而困扰我很久的问题也有了答案,本文中一开始给出的例子,其实不给引号转义也能得到同样的效果。

var my_regexp = /"(?:\\.|[^\\"])*"/   // 这样写其实可以得到一样的效果

说到最后

简单解析一下上面的正则表达式,?:表示这是一个非捕获型分组,即在regexp.exec()方法的返回数组中不会包含该内容,该字面量匹配的内容书中描述是匹配JavaScript字符串,也就是""中的其他内容 。 | 两侧一边是匹配 反斜杠(没有任何意义的ASCII码)和 .(默认匹配除换行符之外的任何单个字符),一边是匹配 非 反斜杠(没有任何意义的ASCII码)和 引号"的内容,可重复0-n遍。其实在我看来想实现这种效果,直接如下的写法就能实现了。

var my_regexp1 = /"(?:.|\n)*"/  // 增加\n主要是为了匹配换行符
my_regexp1.test('"abc123@"')  // true
my_regexp1.test('"\"')  // true
my_regexp1.test('"""')  // true
my_regexp1.test('"\n"') // true

如果只写左侧,就只能匹配以/开头的内容了,我认为是为了匹配不以\开头的内容才加上了右边。如果大家有什么意见欢迎留言沟通,谢谢。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值