我从文件中读取了一个字符串,我将其拆分为字符。例如,字符串是
1|test pattern|prefix|url|postfix
所以拆分必须总是给我5个子串,在上面的例子中是
["1", "test pattern", "prefix", "url", "postfix"]
当这五个子串中的任何一个包含|时出现问题字符。我会把它存储为转义\ |
1|test pattern|prefix|url \| title |postfix
现在,你可以看到string.split('|')不会给我想要的结果。期望的结果是
["1", "test pattern", "prefix", "url \| title ", "postfix"]
我尝试了一些正则表达式,但这些都没有给出理想的结果。
string.split(/[^\\]\|/) //["", "", "prefi", "$url \| $titl", " postfix"]
看起来这只有负面的回顾才能实现,但我无法让它工作
答案 0 :(得分:6)
另一种解决方案:
"1|test pattern|prefix|url \\| title |postfix"
.replace(/([^\\])\|/g, "$1$1|")
.split(/[^\\]\|/);
那就是说,你需要使用另一个反斜杠来逃避初始字符串中的反斜杠以使其工作:
"1|test pattern|prefix|url \\| title |postfix"
^
可用的工作演示here。
答案 1 :(得分:3)
不幸的是,Javascript不支持lookbehinds。我认为没有简单的解决方案,但以下内容可能适合作为解决方法:
// use two backslashes in your string!
var string = '1|test pattern|prefix|url \\| title |postfix';
// create an arbitrary unique substitute character
var sub = "-";
string.replace(/\\\|/g,sub).split(/\|/);
/* replace the substituted character again in your array of strings */
或者你可以使用这样的东西:
string.split(//\|\b//)
然而,在涉及空格的某些情况下,这可能会失败。
答案 2 :(得分:1)
您可以匹配您感兴趣的所有事件,而不是使用split()
:
var rx = /([^\\\|]|\\\|?)+/gi, item, items = [];
while (item = rx.exec(str)) {
items.push(item[0]);
}
中查看此操作
答案 3 :(得分:0)
'foo|bar\\|baz'.match(/(\\\||[^|])+/g)
这将查找包含转义的分割字符或不是分割字符的任何字符的所有字符序列。