Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用空格分隔的值标记字符串,除非值用单引号括起来_Javascript_String_Split_Tokenize - Fatal编程技术网

Javascript 使用空格分隔的值标记字符串,除非值用单引号括起来

Javascript 使用空格分隔的值标记字符串,除非值用单引号括起来,javascript,string,split,tokenize,Javascript,String,Split,Tokenize,任何人都可以告诉我如何在java脚本中拆分一个字符串,并使用不在单引号内的空格 就像字符串是 "0 60 120 180 'node name' 2 34 45 12" “0 60 120 180'节点名称'2 34 45 12” 然后它将标记为 arr[0]=0 arr[1]=60 arr[2]=120 arr[3]=180 arr[4]='node name' arr[5]=2 arr[6]=34 arr[7]=45 arr[8]=12 arr[0]=0 arr[1]=60 arr[2]=1

任何人都可以告诉我如何在java脚本中拆分一个字符串,并使用不在单引号内的空格

就像字符串是

"0 60 120 180 'node name' 2 34 45 12" “0 60 120 180'节点名称'2 34 45 12” 然后它将标记为

arr[0]=0 arr[1]=60 arr[2]=120 arr[3]=180 arr[4]='node name' arr[5]=2 arr[6]=34 arr[7]=45 arr[8]=12 arr[0]=0 arr[1]=60 arr[2]=120 arr[3]=180 arr[4]=“节点名称” arr[5]=2 arr[6]=34 arr[7]=45 arr[8]=12
在拆分过程中,如果单引号删除,那么也很好,因为这是图表中的图例名称,我必须在单元素中获取该名称

如果没有嵌套引号,这将起作用。首先,我搜索字符串中的任何单引号,然后按
空格进行拆分:

var s = "0 60 120 180 'node name' 2 34 45 12";
var a = s.split("'");
var r = [];
for (var i = 0, l = a.length; i <l; i++) {
    if (i % 2) {
        r.push("'" + a[i] + "'");
    }
    else {
        var x = a[i].split(' ');
        for (var j = 0, k = x.length; j < k; j++) {
            if (x[j] != '') {
                r.push(x[j]);
            }
        }
    }
}

console.log(r);
// ["0", "60", "120", "180", "'node name'", "2", "34", "45", "12"]
var s=“0 60 120 180”节点名称“2 34 45 12”;
var a=s.split(“”);
var r=[];
对于(var i=0,l=a.length;i您可以这样做:

var s = "0 60 120 180 'node name' 2 34 45 12";
var arr = [];
s.split("'").forEach(function(v,i){
    arr = arr.concat(i%2 ? v : v.trim().split(' '))
});
它还删除了单引号:

["0", "60", "120", "180", "node name", "2", "34", "45", "12"] 

此正则表达式将执行以下操作:

var arr = string.match(/'[^']*'|[^ ]+/g) || [];

我想我可能会晚一点,而且有点冗长,但这是一个易于理解的通用解决方案。适用于所有分隔符和“连接”字符。还支持长度超过两个单词的“连接”单词…例如“你好,我的名字是‘jon delaware smith fred’。我有一个‘长名字’”

根据@Bergi的建议,我已经让它少了一点冗长

function split(input, delimiter, joiner){
    var output = [];
    var joint = [];
    input.split(delimiter).forEach(function(element){
        if (joint.length > 0 && element.indexOf(joiner) === element.length - 1)
        {
            output.push(joint.join(delimiter) + delimiter + element);
            joint = [];
        }
        if (joint.length > 0 || element.indexOf(joiner) === 0)
        {
            joint.push(element);
        }
        if (joint.length === 0 && element.indexOf(joiner) !== element.length - 1)
        {
            output.push(element);
            joint = [];
        }
    });
    return output;
  }

ES6解决方案支持:

  • 除内引号外按空格拆分
  • 删除引号但不删除反斜杠转义引号
  • 转义引号变为引号
  • 你可以把引号放在任何地方
代码:

输出:

[ '0', '60', '120', '180', 'node name', '2', '34', '45', '12' ]

有没有办法转义需要处理的单引号?使用这个regex.“([^”]*)我有过的最早的副本:。另一个值得注意的:我对模运算符
%
有点粗略。你的if语句
if(I%2)
读-if(I\2)是真的(有余数)做其他事情(如果它是假的)做其他事情吗(如果它正好除以)@MarkWalters正确:
if(i%2)
意味着
if(i不可被2整除)
@JanDvorak-Aha,谢谢你。本质上,使用
%2
将为所有奇数返回true?@MarkWalters本质上是的。更正确的是,它返回
1
0
(分别是truthy和falsy)。”“有点啰嗦”是一个相当保守的说法:-)如果你真的使用了一些标准的数组方法,那就更好了。我只使用了split、length和push……然后是字符串的indexof。不过有2个数组和3个if,哈哈。我不是说没有太多的代码。我想如果我使用更多的内置东西,比如concat和forEach……如果我有时间的话,我可能会编辑它请在IE8上观看,在IE8上的我的系统上,这不起作用,但在firefox上,IE8上它起作用。您需要forEach垫片,可能需要修剪。由于您已经选择了答案,我不会写它们,但如果您愿意,可以在MDN中找到它们。
[ '0', '60', '120', '180', 'node name', '2', '34', '45', '12' ]