字符串
'\\lorem\ipsum\dolor,\\sit\amet\conseteteur,\\sadipscing\elitr\sed\diam'
正在转义,如果您在浏览器的控制台中尝试以下操作,您会看到会发生什么:
var s = '\\lorem\ipsum\dolor,\\sit\amet\conseteteur,\\sadipscing\elitr\sed\diam'
console.log(s);
// prints '\loremipsumdolor,\sitametconseteteur,\sadipscingelitrseddiam'
要使用原始字符串,您必须添加额外的反斜杠,否则它会变成另一个反斜杠,因为它会尝试转义任何后跟一个反斜杠的内容。
它在正则表达式测试器中起作用的原因是,他们可能会清理输入字符串以确保它按原样进行评估。
试试这个(为每个人添加一个额外的 \):
str = '\\\\lorem\\ipsum\\dolor,\\\\sit\\amet\\conseteteur,\\\\sadipscing\\elitr\\sed\\diam'
re = /\\([^\\]*)(?:,|$)/g
str.match(re)
// should output ["\dolor,", "\conseteteur,", "\diam"]
更新
您无法阻止解释器转义 字符串文字 中的反斜杠,但此功能将在 EcmaScript6 中以 String.raw
形式提供
s = String.raw`\\lorem\ipsum\dolor,\\sit\amet\conseteteur,\\sadipscing\elitr\sed\diam`
记得在String.raw 中使用反引号 而不是单引号。
它可以在最新的 Chrome 中运行,但我不能说所有其他浏览器,如果它们比较旧,它可能没有实现。
另外,如果您想避免匹配最后一个反斜杠,您需要:
- 删除正则表达式开头的
\\
- 使用
+ 而不是* 以避免匹配行尾(它会创建额外的捕获)
- 使用积极的前瞻
?=
喜欢这个
s = String.raw`\\lorem\ipsum\dolor,\\sit\amet\conseteteur,\\sadipscing\elitr\sed\diam`;
re = /([^\\]+)(?=,|$)/g;
s.match(re);
// ["dolor", "conseteteur", "diam"]