2014-09-02 121 views
1

我有一个正则表达式,它会将我的字符串拆分为数组,如果它发现NULL \ n'\ nJavascript正则表达式拆分,但保留部分分隔符

我的字符串是:

"'<xml↵ data>', NULL↵'abc', '<xml↵ data>'↵'abc', 'abc'" 

(字符串已与逗号分隔值,所有值都包裹着单引号,除了NULL值的新行与新行定义的,但我真正的问题是。值也可以有新的生产线)

随着/NULL\n|'\n/我得到这样的结果:

["'<xml↵ data>', ", "'abc', '<xml↵ data>", "'abc', 'abc'"] 

卜现在我想保留NULL'分隔符的一部分(如果保留\ n,我也可以)。因此,它应该是这样的:

["'<xml↵ data>', NULL", "'abc', '<xml↵ data>'", "'abc', 'abc'"] 

到目前为止我的代码:

var data = "'<xml\n data>', NULL\n'abc', '<xml\n data>'\n'abc', 'abc'" 
var result = data.split(/NULL\n|'\n/) 
console.log(result) 

非常感谢您的帮助。我现在有类似的线程(like this one),但我不擅长正则表达式,所以我在为我的需求转换解决方案时并不成功。

编辑:工作液(如果其他人需要它)

从@迈克尔·桑切斯回答我创建了一个基于的indexOf(虽然我从性能上看有点担心这方面的工作职能,因为在我的情况下,循环必须越过4MB大文本):

现场演示:http://jsfiddle.net/ngr97jz7/3/我能想到的是

function ConvertToArray(text){ 
    var rows = []; 
    var i = 1; 
    while(i != -1 && i != 0){ 
     //find closer appearance 
     var a = text.indexOf("NULL\n"); 
     var b = text.indexOf("'\n"); 
     i = ((a < b && a != -1) || (a > b && b == -1)) ? a+4 : b+1; //set index + 4 chars for NULL or 1 char for ' 
     if(i == 0 || i == -1){ 
      rows.push(text); 
      break; 
     } 
     rows.push(text.substring(0,i)); 
     text = text.substring(i+1, text.length) 
    } 
    return rows; 
} 
+0

你必须分开一个VOID字符串,这是可以通过在正则表达式中使用分组,但因为lookbehind不被javascript正则表达式支持,我不太确定如何做到这一点。如果你想知道更多,这里有一个PCRE的例子(这不适用于你的正则表达式),但会给你想法,为什么你的代码是这样的,或者一些图书馆在javascript支持向后看,无论如何。 http://regex101.com/r/lR8wG9/1 – 2014-09-02 12:50:25

+0

http://stackoverflow.com/questions/12317499/javascript-and-regex-split-and-keep-delimiter?rq=1 – 2014-09-03 05:50:30

回答

0

一种方法先找到你删除的所有索引使用循环模仿你的整个字符串.indexOf(<string>, <index>);

创建另一个循环,使用您先前检索的索引获取主字符串的所需子字符串。您可以添加那些列表,然后把它变成一个数组算账:

List<String> list = new ArrayList<String>(); 
// after list is populated 
String[] arr = list.toArray(new String[list.size()]); 

编辑: 我的坏,你的问题是在JavaScript。只是无视列表步骤。