3

任何人都可以告诉我用不在单引号内的空格分割java脚本中的字符串。

就像如果字符串是

"0 60 120 180 '节点名称' 2 34 45 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

在拆分期间,如果删除单引号,那么也很好,因为这是图表中的图例名称,我必须在单个元素中获取该名称

4

5 回答 5

5

这个正则表达式会这样做:

var arr = string.match(/'[^']*'|[^ ]+/g) || [];
于 2013-06-05T09:42:20.393 回答
3

你可以这样做 :

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"] 

示范

于 2013-06-05T09:40:37.283 回答
0

想我可能有点晚了,而且有点冗长,但这是一个易于理解和通用的解决方案。适用于所有分隔符和“加入”字符。还支持长度超过两个单词的“连接”单词......例如“你好我的名字是'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;
  }
于 2013-06-05T09:55:15.120 回答
0

如果您没有嵌套引号,这将起作用。首先,我在字符串中搜索任何单引号,然后按以下方式分割space

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"]
于 2013-06-05T09:40:31.007 回答
0

ES6 解决方案支持:

  • 除内引号外按空格分隔
  • 删除引号但不删除反斜杠转义引号
  • 转义报价变成报价
  • 可以在任何地方加上引号

代码:

string.match(/\\?.|^$/g).reduce((p, c) => {
        if(c === "'"){
            p.quote ^= 1;
        }else if(!p.quote && c === ' '){
            p.a.push('');
        }else{
            p.a[p.a.length-1] += c.replace(/\\(.)/,"$1");
        }
        return  p;
    }, {a: ['']}).a

输出:

[ '0', '60', '120', '180', 'node name', '2', '34', '45', '12' ]
于 2017-10-26T05:46:27.043 回答