正则表达式:在逗号之前的最后一个字符之间获取字符串

时间:2015-08-06 15:47:12

标签: javascript regex

我需要一些Regex的帮助。

我有这个字符串:\\lorem\ipsum\dolor,\\sit\amet\conseteteur,\\sadipscing\elitr\sed\diam
想要得到结果:["dolor", "conseteteur", "diam"]左边用最后一个反斜杠和一个逗号或结尾之间的单词。

我已经找到了工作test,但由于其原因,它既没有在Chrome(v44.0.2403.130)也没有IE(v11.0.9600)中工作.17905)控制台。

我得到了结果:["\loremipsumdolor,", "\sitametconseteteur,", "\sadipscingelitrseddiam"]

您能告诉我,为什么在线测试人员没有工作以及如何才能取得正确的结果?

提前致谢。

PS:我已经测试了几个在线正则表达式测试人员,结果完全相同。 (regex101.com,regexpal.com,debuggex.com,scriptular.com)

2 个答案:

答案 0 :(得分:3)

字符串

'\\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'

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

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

试试这个(为每个人添加一个额外的\):

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"]

答案 1 :(得分:1)

你可以试试这个,

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

DEMO

相关问题