Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-正则表达式,用于在未转义字符上拆分字符串,例如|但忽略\|_Javascript_Regex - Fatal编程技术网

Javascript-正则表达式,用于在未转义字符上拆分字符串,例如|但忽略\|

Javascript-正则表达式,用于在未转义字符上拆分字符串,例如|但忽略\|,javascript,regex,Javascript,Regex,我从文件中读取了一个以|字符分割的字符串。例如,字符串是 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|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"]

看起来这只有在使用负回溯时才可能,但我无法让它工作

不幸的是,Javascript不支持lookbehind。我认为没有简单的解决方案,但以下可能适合作为解决方案:

// 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//)
但是,在某些情况下,当涉及空白时,这可能会失败。

另一种解决方案:

"1|test pattern|prefix|url \\| title |postfix"
.replace(/([^\\])\|/g, "$1$1|")
.split(/[^\\]\|/);
也就是说,您需要使用另一个反斜杠来转义初始字符串中的反斜杠,以使其正常工作:

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

可用的工作演示。

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

var rx = /([^\\\|]|\\\|?)+/gi, item, items = [];
while (item = rx.exec(str)) {
    items.push(item[0]);
}
在中看到它的实际作用


这将查找包含转义拆分字符或非拆分字符的所有字符序列。

我认为您无法控制字符串中用于分隔元素的字符?您的字符串将生成:>>var word='1 |测试模式|前缀| url\| title |后缀';>>单词“1 |测试模式|前缀| url |标题|后缀”你的意思是改为“1 |测试模式|前缀| url\\|标题|后缀”吗?@Patrick:我不能更改delimeter,因为现在它已经在许多文件中使用,但我可以更改转义字符\为什么要检查一个不正确的答案?一个简单的
边界就可以了..不需要
替换
@Anirudha我添加了它作为选项,但它会以空格失败。@Christoph这是我能想到的最接近的。但问题是,任何用作任意分隔符的字符也可能出现在任何substring@Kashif好,您只需使用边界正则表达式或sp00m的解决方案,它更优雅、更健壮。这对问题中提到的字符串有效,但对1 |测试模式|前缀| url\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\elements@Kashif,是的,我错过了该项目上的
[0]
,请参阅以了解其工作情况
'foo|bar\\|baz'.match(/(\\\||[^|])+/g)