Javascript跳过字符串中的双管道

时间:2014-07-22 14:53:53

标签: javascript regex

我有以下字符串:

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 \ |

有谁知道如何解决它?

谢谢。

2 个答案:

答案 0 :(得分:5)

首先,我假设您的test字符串实际上包含\|个序列。如果您要显示字符串文字,\|将被解释为|的转义序列。要使此脚本能够正常显示,您需要像这样编写test

var test = "test|2014-07-22 12:13:47||ASD|\\|nameOfSomething123\\||anothersmt";

您可以使用match代替split

轻松完成此操作
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返回一个新数组,以便您可以保留旧数组。