【问题标题】:Regex: get string between last character occurence before a comma正则表达式:在逗号之前的最后一个字符出现之间获取字符串
【发布时间】:2015-08-26 00:19:58
【问题描述】:

我需要一些关于正则表达式的帮助。

我有这个字符串:\\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)

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    字符串

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

    【讨论】:

    • 是的,在字符串中转义。可惜我没注意。但是有什么解决方法,还是我必须在应用正则表达式之前先将每个反斜杠加倍?
    • 太棒了!感谢您的帮助。
    【解决方案2】:

    你可以试试这个,

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

    DEMO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      相关资源
      最近更新 更多