这是一个非常简单的正则表达式,但是我无法理解我如何扩展这个正则表达式,这样只要它在字符串中被转义就可以使用我的分隔符。这就是我所拥有的:
// 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风格正则表达式的任何好资源?
答案 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 "\|"中进行了讨论。
但是,正如所指出的,上面的并没有触及 \ |序列,因此离开转义序列。
或者,多步骤方法也可以解决这个问题,也可以将转义字符作为过程的一部分来处理。
在代码中,
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中编写该字符串只会将它们解析为转义字符。