任何正文都可以告诉我在java脚本中拆分一个字符串,该空格不在单引号内。
如果字符串是
"0 60 120 180 'node name' 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
在拆分期间,如果单引号删除,那么也很好,因为这是图表中的图例名称,我必须在单个元素中获取该名称
答案 0 :(得分:5)
这个正则表达式会这样做:
var arr = string.match(/'[^']*'|[^ ]+/g) || [];
答案 1 :(得分: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"]
答案 2 :(得分: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"]
答案 3 :(得分: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;
}
答案 4 :(得分: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' ]