除了引号之外的空格上的拆分字符串,但包括不完整的引号

时间:2016-01-23 13:55:44

标签: javascript regex string

我试图在空格中拆分JS中的字符串,除非空格在引号中。但是,应保留不完整的引用。我不熟练使用正则表达式魔法,并且一直在使用以下正则表达式:

var list = text.match(/[^\s"]+|"([^"]*)"/g)

但是,如果我提供sdfj "sdfjjk之类的输入,则会["sdfj","sdfjjk"]而不是["sdfj",""sdfjjk"]

3 个答案:

答案 0 :(得分:1)

您可以使用

$("#column1").click(function(){
    $("#column3").hide();
    $("#column2").hide();
    $("#column1").css("display", 'block');
    $("#column3 a").removeClass();
    $("#column2 a").removeClass();
    $("#column1 a").addClass("current");

    $.cookie("column1", 1);

});

var cookieVal = $.cookie("column1");
if ( cookieVal == 1 ) 
{
    $("#column3").hide();
    $("#column2").hide();
    $("#column1").css("display", 'block');
    $("#column3 a").removeClass();
    $("#column2 a").removeClass();
    $("#column1 a").addClass("current");
}

通过使用var re = /"([^"]*)"|\S+/g; (= \S),我们只从被否定的字符类中删除[^\s]。 通过在"之前放置"([^"]*)"模式,我们可以确保引号中的子字符串在它们出现之前不会被撕裂。如果字符串包含配对良好的引用子串并且最后一个未配对,则此方法应该有效。

演示:



\S+




请注意,要在引号之间获取捕获的文本,您需要在循环中使用var re = /"([^"]*)"|\S+/g; var str = 'sdfj "sdfjjk'; document.body.innerHTML = JSON.stringify(str.match(re));(如RegExp#exec" drop" submatches)。

更新

不知道downvoter在downvoting时的想法,但让我猜。引号通常用于单词字符周围。如果有一个" wild"引用,它仍然是一个词之前/之后的引用。

因此,我们可以使用这样的单词边界:

String#match

请参阅regex demo

在此处,"\b[^"]*\b"|\S+ 匹配后跟单词字符的"\b[^"]*\b",然后匹配除"以外的零个或多个字符,然后跟随"之前是一个单词字符。

朝着这个方向迈进,我们可以做到:

"

对于\B"\b[^"\n]*\b"\B|\S+ ,我们要求\B"前面应加上非单词字符,而"后面应加上非单词字符。

请参阅another regex demo

很大程度上取决于您对特定输入的具体问题!

答案 1 :(得分:0)

尝试以下方法:

text.match(/".*?"|[^\s]+/g).map(s => s.replace(/^"(.*)"$/, "$1"))

这反复找到正确引用的子串(第一个)或其他非空白序列。 map部分是删除引用的子字符串周围的引号。

> text = 'abc "def ghi" lmn "opq'
< ["abc", "def ghi", "lmn", ""opq"]

答案 2 :(得分:-1)

您可以在从输入中删除潜在的最后一个孤立引用后使用此拆分:

var text = 'abc "def ghi" lmn "opq';
var arr = text.replace(/((?:(?:[^"]*"){2})*[^"]*)(?:"|$)/g, '$1').
              split(/(?=(?:(?:[^"]*"){2})*[^"]*$)\s+/g);

//=> [abc, "def ghi", lmn, opq]

text = 'sdfj "sdfjjk';
var arr = text.replace(/((?:(?:[^"]*"){2})*[^"]*)(?:"|$)/g, '$1').
              split(/(?=(?:(?:[^"]*"){2})*[^"]*$)\s+/g);

//=> [sdfj, sdfjjk]

首先replace检测并删除text中的最后一个孤立引用,然后我们在空格上使用split,后跟偶数引号(从而确保空格在引号之外) )。