【问题标题】:RegExp lookbehind assertion alternativeRegExp 后向断言替代方案
【发布时间】:2018-08-13 23:33:12
【问题描述】:

鉴于下面的字符串,您如何将其拆分为仅包含双引号字符串(忽略嵌套的引号字符串)而不使用后向断言的数组?

源字符串:1|2|3|"A"|"B|C"|"\"D\"|\"E\""

目标数组:

[
  '"A"',
  '"B|C"',
  '"\"D\"|\"E\""'
]

基本上,我正在尝试寻找/(?<!\\)".*?(?<!\\)"/g 的替代品,因为Firefox 目前不支持lookbehinds。该解决方案不必使用正则表达式,但应该相当有效。

【问题讨论】:

    标签: javascript regex lookbehind


    【解决方案1】:

    只要找到所有引用的文字/"[^"\\]*(?:\\[\S\s][^"\\]*)*"/g
    不需要为此拆分。

    https://regex101.com/r/r5SJsR/1

    格式化

     "
     [^"\\]*                       # Double quoted text
     (?: \\ [\S\s] [^"\\]* )*
     "
    

    【讨论】:

      【解决方案2】:

      简单的正则表达式/"[^\\"]+"|"\S*"/g怎么样。

      • 前两组("A"'"B|C")被 "[^\\"]+" 覆盖 - 任何不是反斜杠或包含在一组引号内的引号的内容
      • 管道 (|) 分隔两个条件句
      • 第三组 ("\"D\"|\"E\"") 简单地被 "\S*" 覆盖 - 任何非空格都包含在一组引号中

      这将返回与您的初始正则表达式相同的结果,没有后视,并且可以看到在 Regex101 here 上工作。

      【讨论】:

      • 这适用于问题中给出的一个示例,但一旦您重新排序管道分隔的字符串,它就会停止工作,例如:1|2|3|"A"|"\"D\"|\"E\""|"B|C"
      • 匹配"hello\\"world"
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      相关资源
      最近更新 更多