【问题标题】:JS regexp to split string based on character not preceded by backslashJS正则表达式根据前面没有反斜杠的字符拆分字符串
【发布时间】:2017-05-07 12:09:32
【问题描述】:

我想使用 JS 字符串 split 函数仅基于逗号 , 而不是反斜杠前面的逗号 /, 来拆分此字符串。我该怎么做?

'this,is\,a,\,string'.split(/,/)

此代码将它拆分为所有字符串,我不知道如何让它仅拆分为前面没有反斜杠的逗号。

【问题讨论】:

  • 如果你要分割的逗号前面总是有一个单词字符,你可以use a word boundary。不确定这是否足以满足您的所有输入。
  • 你能举个例子吗?
  • 您为什么要这样做?请提供更多上下文。似乎有人错误地用反斜杠转义逗号,但没有转义反斜杠。如果是这样的话,两个不同的字符串列表可以被编码为同一个字符串,并且不可能毫无歧义地对其进行解码。
  • 您需要在字符串中添加额外的反斜杠:'this,is\\,a,\\,string'.split(/\b,\b/);

标签: javascript node.js regex string


【解决方案1】:

由于 JavaScript 不支持lookbehinds,因此很难为拆分定义“不以某事为先”的模式。但是,您可以将“单词”定义为一系列非逗号或转义逗号:

(?:\\,|[^,])+

(演示:https://regex101.com/r/d5W21v/1)

并提取所有“单词”匹配:

var matches = "this,is\\,a,\\,string".match(/(?:\\,|[^,])+/g);
console.log(matches);

【讨论】:

    【解决方案2】:

    用临时符号替换非拆分符号,拆分,然后恢复非拆分符号

     'this,is\,a,\,string'.replace('\,','##NONBREAKING##').split(',')
    

    然后循环遍历结果数组,将 '##NONBREAKING##' 替换为 '\,'。

    显然,临时符号 '##NONBREAKING##' 必须是在您要中断的文本中永远不会出现的东西。也许包括一些难以输入的 Unicode 字符?或者包括来自多种不同语言的字符(例如中文、俄语、印度语、美洲原住民),这些字符不太可能一起出现在真正的文本中。

    【讨论】:

    • 同意。但是应该有可能想出一个非常难以置信的组合,例如┋₪↝⅊﷼ Сᵯ✈ ℈◆ᾋ。
    【解决方案3】:

    我认为您要查找的内容称为“Negative Lookbehind”- 一个正则表达式元素,它在字符串中回顾并确保该模式之前没有其他模式。

    但是,Javascript 本身并不支持 Lookbehind。 但是,它确实(负面和正面)支持 Lookahead。

    所以你可以: 1.反转字符串 2. 用逗号分隔(除非后面是斜线) 3.把单词倒过来 4. 单词倒序

    var temp = "this,is\\,a,\\,string"
    var reversed = temp.split('').reverse().join('')
    var words = t2.split(/,(?!\\)/).map(x => x.split('').reverse().join(''))
    var finalResult = words.reverse()
    

    虽然有点麻烦...

    【讨论】:

      【解决方案4】:

      您也可以创建一个检索数组的自定义方法。如果找到逗号并且它前面没有反斜杠,则为子字符串。显然你需要一个计数器来更新逗号旁边的位置。

      希望对你有帮助

      【讨论】:

      • 你能举个例子吗?
      • 你创建一个空数组。然后一个 for 遍历字符串。如果找到逗号并且前一个字符不是反斜杠,则从零到前一个字符的位置的子字符串(如果您不在开头)。将计数器更新为逗号位置,以了解下一次子字符串的位置。
      【解决方案5】:

      目前仅 Chrome 62(桌面和 Android)、Opera 49 和 Node.js 8.10 支持此方法

      一组有限的 JavaScript 引擎现在支持lookbehinds,因此以下在受支持的环境中工作:

      console.log('this,is\\,a,\\,string'.split(/(?<!\\),/))

      由于这目前在 Firefox、Safari 或 iOS Chrome(以及其他)中不起作用,因此它对客户端开发并不是特别有用,但它对 Node 应用程序很有用。

      Mozilla 有一个最新的 browser compatibility 部分,用于正则表达式后视。

      【讨论】:

      • 在节点 11.3 上,我尝试了 'this,is\,a,\,string'.split(/(?<!\\),/),它给出的结果与我的问题 'this,is\,a,\,string'.split(/,/) 中的代码相同。您发布的代码在节点中是否正常工作?
      • 它没有抛出错误的事实意味着你的 Node.js 版本支持lookbehinds。看起来你的问题是你没有逃避你的\'s。您的反斜杠正在转义逗号,这只是逗号,因此它正在评估字符串 this,is,a,string 上的正则表达式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 2012-06-14
      • 2015-07-14
      • 1970-01-01
      • 2020-07-23
      相关资源
      最近更新 更多