JS regexp基于不带反斜杠的字符来拆分字符串

时间:2017-05-07 12:09:33

标签: javascript node.js regex string

我想使用JS String split函数仅根据逗号,拆分此字符串,而不是以反斜杠/,开头的逗号。我怎么能这样做?

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

此代码将其拆分为所有字符串,我不确定如何将其拆分为不带反斜杠的逗号。

5 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:1)

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

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

然后遍历生成的数组,将'## NONBREAKING ##'替换为'\,'。

显然,临时符号'## NONBREAKING ##'必须能够永远不会出现在您正在破坏的文本中。也许包含一些难以输入的Unicode字符?或者包括来自多种不同语言的字符(例如中文,俄文,印度文,美国本土),这些字符不太可能在真文本中一起出现。

答案 2 :(得分:1)

我认为您正在寻找的内容被称为" Negative Lookbehind" - 一个正则表达式元素,它回顾字符串并确保模式前面没有其他模式。

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

所以你可以: 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()

虽然很麻烦......

答案 3 :(得分:0)

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

希望这会有所帮助

答案 4 :(得分:0)

Chrome 62(台式机和Android),Opera 49和Node.js 8.10当前仅支持此方法

现在有限的JavaScript引擎集支持向后搜索,因此以下内容可在受支持的环境中工作:

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

由于该功能目前在Firefox,Safari或iOS Chrome浏览器(及其他)中不起作用,因此它对客户端开发不是特别有用,但对Node应用程序非常有用。

Mozilla具有用于正则表达式后退的最新browser compatibility部分。