拆分可以转义分隔符的字符串

时间:2018-04-07 23:07:46

标签: javascript regex split escaping

这是一个非常简单的正则表达式,但是我无法理解我如何扩展这个正则表达式,这样只要它在字符串中被转义就可以使用我的分隔符。这就是我所拥有的:

// Contents of str is exactly '|1|2|\|Three and Four\||5'
str.match(/[^|]/);

// Looking for: ['1', '2', '|Three and Four|', '5']

所以目前我的正则表达式选择了不是|字符的所有内容,我得到了每个项目的数组。但我想要做的是忽略|字符作为分隔符,如果它首先使用\进行转义,但我当然不希望\通过。

我知道这将被标记为十亿其他正则表达式问题的副本,但我已尝试将其他解决方案应用于我自己,并使用regex101.com。唉,我的Regex Fu并不强大。

P.S。有谁知道学习JS风格正则表达式的任何好资源?

2 个答案:

答案 0 :(得分:1)

如果使用带有支持负面观察的正则表达式引擎的JavaScript(例如Chrome),并且只显示单个/简单转义的情况,并且没有方法可以逃脱 - -escape,可以使用相对简单的负面观察:

'|1|2|\\|Three and Four\\||5'.split(/(?<!\\)\|/)

# -> ["", "1", "2", "\|Three and Four\|", "5"]

这表示 - 在支持负面观察的Chrome中 - 分为&#34; |&#34;没有&#34; \&#34;。

之前

Here is a method to convert a look-behind to a look-ahead用于引擎兼容性。变体也在RegEx needed to split javascript string on "|" but not "\|"中进行了讨论。

但是,正如所指出的,上面的并没有触及 \ |序列,因此离开转义序列。

或者,多步骤方法也可以解决这个问题,可以将转义字符作为过程的一部分来处理。

  1. 使用&#34;替代&#34;替换转义的分隔符。字符/字符串
  2. 拆分剩余的(未转义的)分隔符
  3. 转换&#34;替代&#34;字符/字符串返回单个组件
  4. 在代码中,

    str = '|1|2|\\|Three and Four\\||5'
    
    # replace \| -> "alternative"
    # this assumes that \\| (escape-the-escape) is not allowed
    rep = str.replace(/\\[|]/g, '~~~~')
    
    # replace back, without any of the escapes
    res = rep.split('|').map(function (f) { return f.replace(/~~~~/g, "|") })
    
    # res -> ["", "1", "2", "|Three and Four|", "5"]
    

答案 1 :(得分:1)

这应该这样做:

var str =  '|1|2|\\|Three and Four\\||5';
str.match(/((\\\|)|[^|])+/gi)

我的输出是:

 ["1", "2", "\|Three and Four\|", "5"]

我所做的是创建一个匹配第一个子模式中\|字符串的模式,然后匹配任何非|的模式。我也逃脱了\,因为否则在javascript中编写该字符串只会将它们解析为转义字符。