删除每隔一个逗号,并用括号括起来。

3

使用jQuery,我有一串坐标字符串,如下所示:

38.313072,-89.863845,38.312675,-89.863586,38.310405,-89.862091,38.310405,-89.862091,38.309913,-89.861976,38.309768,-89.861976,38.309768,-89.861976

我需要它们看起来像这样:

[38.313072, -89.863845] [38.312675, -89.863586] [38.310405, -89.862091] [38.310405,-89.862091] [38.309913, -89.861976] [38.309768, -89.861976] [38.309768, -89.861976] [38.30965, -89.861991]

我需要想办法将每隔一个逗号用空格和括号替换成坐标集。

有什么好的建议吗?

5个回答

3
你可以使用正则表达式。
([-\d.]+),([-\d.]+),?

正则表达式解释和实时演示

  1. [-\d.]: 字符类,- 匹配连字符 -\d 匹配一个数字,. 匹配句点 .。当在类序列中提到时,顺序无关紧要。
  2. +: 匹配前面匹配项的一个或多个出现
  3. (...): 捕获组。大括号内的匹配项被捕获并返回为 $1$2 等。
  4. ,?: 不匹配其他逗号
  5. g: 全局匹配。匹配所有可能的出现。

jsFiddle 演示

var str = '38.313072,-89.863845,38.312675,-89.863586,38.310405,-89.862091,38.310405,-89.862091,38.309913,-89.861976,38.309768,-89.861976,38.309768,-89.861976';

var result = str.replace(/([-\d.]+),([-\d.]+),?/g, '[$1, $2] ').trim();
document.getElementById('output').innerHTML = JSON.stringify(result, 0, 2);
<pre id="output"></pre>


非常接近,但我不需要方括号集合之间的逗号。 - Dean
@Tushar,你看,它不能被安全地移除! - Anonymous0day
@Dean,请看下面我的回答!它完全符合你的需求! - Anonymous0day
@Tushar好多了!以前不太安全! - Anonymous0day
@Dean 欢迎!很高兴能帮助 :) - Tushar
@Tushar - 等一下...我确实需要那个逗号。 - Dean

1
使用正则表达式!它非常适合这个!

var str = "38.313072,-89.863845,38.312675,-89.863586,38.310405,-89.862091,38.310405,-89.862091,38.309913,-89.861976,38.309768,-89.861976,38.309768,-89.861976,38.30965, -89.861991";

var expected = "[38.313072, -89.863845] [38.312675, -89.863586] [38.310405, -89.862091] [38.310405,-89.862091] [38.309913, -89.861976] [38.309768, -89.861976] [38.309768, -89.861976] [38.30965, -89.861991]"


var computed = str.replace(/(([0-9\-. ]*)(,)([0-9\-. ]*)),?/g, '[$2 $3 $4] ');

document.write('computed<br>')
document.write(str.replace(/(([0-9\-. ]*)(,)([0-9\-. ]*)),?/g, '[$2 $3 $4] '))



document.write( "<hr>expected<br>" + expected  )


我再次阅读了问题,发现OP想要用空格替换每个逗号,输入字符串中不包含空格,因此可以删除类中的“-”空格。 - Tushar
@Tushar,我已经修改了我的答案,让你更容易看到它是如何“完美地契合”的!(我添加了预期和计算结果),这样你就可以进行比较 :-) - Anonymous0day
你仍然可以从字符类中删除空格,[0-9\-. ] ==> [0-9\-.] +1 - Tushar
可以,但最好保留它,因为我们可以匹配包含“空格”的人类输入! - Anonymous0day
@Tushar 是的!当然可以!为什么不呢! - Anonymous0day
显示剩余4条评论

0

这应该可以完成工作。

function toPairs(src){
  // Split the string into values.
  var values = src.split(',');
  
  // Group these values 2 by 2.
  var pairs = [];
  for(var i = 0; i < values.length; i += 2){
    pairs.push("[" + values[i] + ", " + values[i + 1] + "]");
  }
  
  // Join with a whitespace.
  return pairs.join(" ");
}

document.body.innerHTML = toPairs("38.313072,-89.863845,38.312675,-89.863586,38.310405,-89.862091,38.310405,-89.862091,38.309913,-89.861976,38.309768,-89.861976,38.309768,-89.861976");


0
尝试使用while循环,Array.prototype.splice(),将结果作为数组的数组返回。

var str = "38.313072,-89.863845,38.312675,-89.863586,38.310405,-89.862091,38.310405,-89.862091,38.309913,-89.861976,38.309768,-89.861976,38.309768,-89.861976"
, res = []
, arr = str.split(",");
while (arr.length) res.push(arr.splice(0, 2))

console.log(res, JSON.stringify(res, null, 2))


你忘记在正则表达式中加入-减号了。 - Tushar
@Tushar 请查看更新的帖子。用 .splice() 替换了 while 循环和 RegExp - guest271314

0

不太美观,但它能工作:

var coordinateString = "38.313072,-89.863845,38.312675,-89.863586,38.310405,-89.862091,38.310405,-89.862091,38.309913,-89.861976,38.309768,-89.861976,38.309768,-89.861976";

var coordinateArray = coordinateString.split(",");
var coordinateResult = "";
var i = 0;
while(i<coordinateArray.length){
  coordinateResult +="[" + coordinateArray[i] + ", " + coordinateArray[i+1] + "]";
  i += 2;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接