繁体   English   中英

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

[英]Regex: get string between last character occurence before a comma

我需要有关正则表达式的帮助。

我有以下字符串: \\\\lorem\\ipsum\\dolor,\\\\sit\\amet\\conseteteur,\\\\sadipscing\\elitr\\sed\\diam
并希望得到结果: ["dolor", "conseteteur", "diam"]
因此,换句话说,最后一个反斜杠与逗号或末尾之间的单词。

我已经想出了一个可以进行测试的测试 ,但是由于某种原因,它在两种测试中都不起作用
Chrome(v44.0.2403.130)或IE(v11.0.9600.17905)控制台。

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

您能否告诉我,为什么在线测试仪无法正常工作,我如何才能获得正确的结果?

提前致谢。

PS:我已经测试了一些在线正则表达式测试器,所有结果都相同。 (regex101.com,regexpal.com,debuggex.com,scriptular.com)

字符串

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

UPDATE

您不能阻止解释器在字符串文字中转义反斜杠,但是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"]

你可以试试看

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

DEMO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM