我有以下字符串:
var test = "test|2014-07-22 12:13:47||ASD|\|nameOfSomething123\||anothersmt";
var s = test.split('|');
console.log(s);
//outputs
[ 'test',
'2014-07-22 12:13:47',
'',
'ASD',
'',
'nameOfSomething123',
'',
'anothersmt' ]
因为| nameOfSomething123 |也有管道,分裂(' |'),结果不好,我需要摆脱第5和第6位置。不好。
我想拆分它,但跳过\ | nameOfSomething123 \ |
有谁知道如何解决它?
谢谢。
答案 0 :(得分:5)
首先,我假设您的test
字符串实际上包含\|
个序列。如果您要显示字符串文字,\|
将被解释为|
的转义序列。要使此脚本能够正常显示,您需要像这样编写test
:
var test = "test|2014-07-22 12:13:47||ASD|\\|nameOfSomething123\\||anothersmt";
轻松完成此操作
test.match(/(\\\||[^|])+/g);
// outputs
[ "test",
"2014-07-22 12:13:47",
"ASD",
"\|nameOfSomething123\|",
"anothersmt" ]
此模式匹配\|
的一个或多个序列或|
以外的任何字符。请注意,\
和|
需要转义才能引用文字\
和|
字符。鉴于您的样本输入,这应该实现目标。 (当然,如果\
也可以被转义,那会让它变得复杂一点)
如果您需要在||
这两个管道之间捕获空字符串,那么您可以在匹配值周围使用split
,并在分隔符周围使用filter
。例如:
test.split(/((?:\\\||[^|])*)/g).filter(function(x, i) { return i % 2 });
// outputs
[ "test",
"2014-07-22 12:13:47",
"",
"ASD",
"\|nameOfSomething123\|",
"anothersmt" ]
这是有效的,因为split
会将任何捕获的子字符串作为结果数组中的单独条目返回。然后filter
只从结果中选择所有其他元素。请注意filter
需要ECMAScript 5.1或更高版本,因此它可能无法在旧版浏览器中使用。如果这是一个问题,请参阅链接文档中描述的polyfill选项。
答案 1 :(得分:0)
我不明白为什么这是一个难题。如果您的分隔符总是 |
,那么当您从.split
获取空字符串时,唯一的情况就是当您有一个双|
时(或者三倍或四倍)。只要双管没有语义目的,你需要做的就是摆脱空字符串:
function check_for_empty_string(element){
if (element.length != 0) return element;
}
s = s.filter(check_for_empty_string);
现在s
应该只包含非空字符串并且您已完成。 Array.filter
是一个内置的javascript,它接受一个检查元素的回调。无论从回调中返回什么,都会通过过滤器进入新数组。在这里,我将旧数组用作目标,为简洁起见,.filter
返回一个新数组,以便您可以保留旧数组。