关于javascript:regex:get字符串,位于逗号前最后一个字符之间

Regex: get string between last character occurence before a comma

我需要一些关于雷杰克斯的帮助。

我有一根绳子:\\lorem\ipsum\dolor,\\sit\amet\conseteteur,\\sadipscing\elitr\sed\diam。想要得到结果:["dolor","conseteteur","diam"],换句话说,就是最后一个反斜杠和逗号或结尾之间的单词。

我已经想出了一个有效的测试方法,但由于某些原因,它在NeitherChrome(v44.0.2403.130)或IE(v11.0.9600.17905)控制台中都不起作用。我得到的结果是:["\loremipsumdolor,","\sitametconseteteur,","\sadipscingelitrseddiam"]

你能告诉我,为什么在线测试人员不工作,我如何才能得到正确的结果吗?

事先谢谢。

PS:我已经用相同的结果测试了一些在线regex测试人员。(regex101.com、regexpal.com、debuggex.com、scriptular.com)


1
'\\lorem\ipsum\dolor,\\sit\amet\conseteteur,\\sadipscing\elitr\sed\diam'

正在转义,如果您在浏览器控制台中尝试以下操作,您将看到发生的情况:

1
2
3
var s = '\\lorem\ipsum\dolor,\\sit\amet\conseteteur,\\sadipscing\elitr\sed\diam'
console.log(s);
// prints '\loremipsumdolor,\sitametconseteteur,\sadipscingelitrseddiam'

要使用原始字符串,必须添加额外的反斜杠,否则它将变为另一个反斜杠,因为它试图转义后面跟着一个反斜杠的任何内容。

它在regexp测试人员中工作的原因是,他们可能会清理输入字符串,以确保按原样对其进行评估。

尝试此操作(为每个操作添加了一个额外的):

1
2
3
4
5
6
7
str = '\\\\lorem\\ipsum\\dolor,\\\\sit\\amet\\conseteteur,\\\\sadipscing\\elitr\\sed\\diam'

re = /\\([^\\]*)(?:,|$)/g

str.match(re)

// should output ["\dolor,","\conseteteur,","\diam"]

更新

您不能阻止解释器在字符串文本中转义反斜杠,但此功能将ecmascript6作为string.raw提供。

1
s = String.raw`\\lorem\ipsum\dolor,\\sit\amet\conseteteur,\\sadipscing\elitr\sed\diam`

记住,在String.raw中使用反勾号而不是单引号。它在最新的Chrome中工作,但我不能说对于所有其他浏览器来说,如果它们是中等老的,那么它可能没有实现。

此外,如果要避免匹配最后一个反斜杠,则需要:

  • 在regexp开始时删除EDOCX1[1]
  • 使用+而不是*,以避免与线端匹配(它将创建额外的捕获)
  • 使用积极的前瞻性?=

这样地

1
2
3
4
s = String.raw`\\lorem\ipsum\dolor,\\sit\amet\conseteteur,\\sadipscing\elitr\sed\diam`;
re = /([^\\]+)(?=,|$)/g;
s.match(re);
// ["dolor","conseteteur","diam"]


你可以试试这个,

1
string.match(/[^\\,]+(?=,|$)/gm);

演示