我正在尝试拆分字符串:
Chan 0: 2.50 0.12 13.92 83.46,Chan 1: 2.58 85.92 2.47 9.03,Chan 2: 5.00 85.0 33.33 6.64,Chan 3: 0.00 0.00 14.41 85.59
我正在努力获得数字。我试图使用以下正则表达式:
/(\bChan\s[0-9]\b|\b,Chan\s[0-9]\b):\s|\s/
根据regextester.com我应该期待16个字符串,但是当我尝试打印包含拆分字符串的var的长度时,我得到41。
我的代码是:
var x = values.value;
var v = x.split(/(\bChan\s[0-9]\b|\b,Chan\s[0-9]\b):\s|\s+/);
console.log(v.length);
其他问题:我尝试在最后省略|\s
以将字符串拆分为chan #
字符串。当我尝试打印它时,它确实分裂了我得到9的长度我仍然可以打印我使用的分隔符,Chan #:
我认为split的返回值只是我使用的分隔符之间的值而不是分隔符本身?
答案 0 :(得分:2)
您可以只提取带有点的数字。
var string = "Chan 0: 2.50 0.12 13.92 83.46,Chan 1: 2.58 85.92 2.47 9.03,Chan 2: 5.00 85.0 33.33 6.64,Chan 3: 0.00 0.00 14.41 85.59",
values = string.match(/\d+\.\d+/g);
console.log(values.length);
console.log(values);
答案 1 :(得分:1)
(\bChan\s[0-9]\b|\b,Chan\s[0-9]\b):\s|\s
正则表达式包含一个捕获组,String.split()
始终将捕获的子字符串放入生成的数组中。此外,模式在字符串的开头匹配,因此在结果数组的开头放置一个空项。
有几种方法可以解决问题,这取决于输入的内容。如果您知道在始终采用相同格式的浮点数之间始终存在Chan
+空格+数字+ :
,则可以使用Nina的建议string.match(/\d+\.\d+/g)
,因为它最简单。
您也可以通过删除捕获组并删除空项来修复您的方法:
var x = "Chan 0: 2.50 0.12 13.92 83.46,Chan 1: 2.58 85.92 2.47 9.03,Chan 2: 5.00 85.0 33.33 6.64,Chan 3: 0.00 0.00 14.41 85.59";
var v = x.split(/(?:\b,?Chan\s+\d+:)?\s+/).filter(Boolean);
console.log(v.length);
console.log(v);

如果您需要在Chan
+位数+ :
之后只获取非空白块的方法,您可以考虑一个两步解决方案:匹配分隔符后的子字符串然后拆分:< / p>
var x = "Chan 0: 2.50 0.12 13.92 83.46,Chan 1: 2.58 85.92 2.47 9.03,Chan 2: 5.00 85.0 33.33 6.64,Chan 3: 0.00 0.00 14.41 85.59";
var v=[],m;
var rx = /\bChan\s+\d+:\s+([\s\d.]+)/g;
while(m=rx.exec(x)) {
m[1].split(/\s+/).map(function(c) {return v.push(c);});
}
console.log(v.length);
console.log(v);
&#13;