9

我从我拆分的文件中读取了一个字符串 | 特点。例如字符串是

1|test pattern|prefix|url|postfix

所以 split 必须总是给我 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"]

看起来这只有在负面回顾的情况下才有可能,但我无法让一个工作

4

4 回答 4

7

另一种解决方案:

"1|test pattern|prefix|url \\| title |postfix"
.replace(/([^\\])\|/g, "$1$1|")
.split(/[^\\]\|/);

也就是说,您需要使用另一个反斜杠来转义初始字符串中的反斜杠以使其工作:

"1|test pattern|prefix|url \\| title |postfix"
                           ^

可在此处获得工作演示。

于 2012-09-05T12:05:12.857 回答
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//)

但是,当涉及空格时,这在某些情况下可能会失败。

于 2012-09-05T11:43:46.767 回答
1

而不是使用split()您可以匹配您感兴趣的所有事件:

var rx = /([^\\\|]|\\\|?)+/gi, item, items = [];
while (item = rx.exec(str)) {
    items.push(item[0]);
}

在Fiddle中查看它的实际效果

于 2012-09-05T12:24:45.090 回答
0
'foo|bar\\|baz'.match(/(\\\||[^|])+/g)

这将查找包含转义的拆分字符或任何不是拆分字符的字符的所有字符序列。

于 2020-04-30T22:45:14.330 回答