我试图在空格中拆分JS中的字符串,除非空格在引号中。但是,应保留不完整的引用。我不熟练使用正则表达式魔法,并且一直在使用以下正则表达式:
var list = text.match(/[^\s"]+|"([^"]*)"/g)
但是,如果我提供sdfj "sdfjjk
之类的输入,则会["sdfj","sdfjjk"]
而不是["sdfj",""sdfjjk"]
。
答案 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"
前面应加上非单词字符,而"
后面应加上非单词字符。
很大程度上取决于您对特定输入的具体问题!
答案 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
,后跟偶数引号(从而确保空格在引号之外) )。