我是stackoverflow的新手,希望能给我一些建议来帮助我解决这个问题。我有两个字符串,我想从中提取数字
String 1 = "12.3,Name1,3,4,Name2,35,Name3"
返回[12.3,3,4,35]
这是必需的结果。
String 2 = "12.3,22,Q"
返回[12.322]
这是错误的结果,应该是[12.3,22]
我已经用完成任务所采取的步骤对我的代码进行了评论。再次感谢您提前提供的建议和帮助。
这是我的代码副本:
function extractNumbers(str) {
//Use replace() to replace all instances of letters/alpha*
let onlyNumbersString = str.replace(/[a-z]/ig, '');
//remove "," using replace()*
onlyNumbersString = onlyNumbersString.replace(",", "");
//Create an array of numbers*
let arrayOfNumbers = onlyNumbersString.split(',');
let result = arrayOfNumbers.map((x) => parseFloat(x))
console.log(arrayOfNumbers)
console.log(result);
const filtered = result.filter(function(e) {
return e
})
console.log(filtered)
}
let numbers = "12.3,Name1,3,4,Name2,35,Name3" //returns [12.3,3,4,35]
//"12.3,22,Q" returns [12.322]*
extractNumbers(numbers)
您可以简单地在,
上进行拆分,并检查它是否是非的有效数字
function extractNumbers(str) {
let onlyNumbersString = str.split(',').filter(v => /^d+(.d+)?$/.test(v))
console.log(onlyNumbersString)
}
let numbers = "12.3,Name1,3,4,Name2,35,Name3" //returns [12.3,3,4,35]
//"12.3,22,Q" returns [12.322]*
extractNumbers(numbers)
extractNumbers('12.3,22,Q')
如果您不想使用regex,可以使用isNaN
let onlyNumbersString = str.split(',').filter(v => v.trim() && !isNaN(v))
错误的结果是因为这一行:
onlyNumbersString = onlyNumbersString.replace(",", "");
一旦这样做,"12.3,22,"
(以前是"12.3,22,Q"
,但之前去掉了Q
(就变成了"12.322"
,所以看起来像是一个单独的数字。
我会先拆分,然后删除其中包含非数字文本的段,然后转换为数字:
function extractNumbers(str) {
// Split on commas, since that seems to be the delimiter you want
const parts = str.split(",");
// Remove any strings that aren't all number chars (including `.`)
const filtered = parts.filter((s) => !/[^.d]/.test(s));
// Convert to number
const numbers = filtered.map((s) => parseFloat(s));
return numbers;
}
console.log(extractNumbers("12.3,Name1,3,4,Name2,35,Name3"));
或无评论:
function extractNumbers(str) {
const parts = str.split(",");
const filtered = parts.filter((s) => !/[^.d]/.test(s));
const numbers = filtered.map((s) => parseFloat(s));
return numbers;
}
你可以把它做成一个单独的语句,但调试起来会变得更困难:
function extractNumbers(str) {
return str
.split(",")
.filter((s) => !/[^.d]/.test(s))
.map((s) => parseFloat(s));
}
我应该注意的是,检查一个段是否有效的唯一原因是parseFloat
会很高兴地接受"123abc"
,返回123
并忽略其余部分。您可以使用一元+
运算符或Number
函数来检查""
的情况(如果您不剔除它,就会得到0
(:
function extractNumbers(str) {
const parts = str.split(",");
const numbers = parts.map((s) => s.trim() ? +s : NaN);
const validNumbers = numbers.filter((num) => !isNaN(num));
return validNumbers;
}
console.log(extractNumbers("12.3,Name1,3,4,Name2,35,Name3"));
我在这里的答案介绍了将字符串转换为数字的各种选项,以及每种选项的陷阱。
我认为您可以使用以下regex 构建所需的输出
/bd+.?d*b/g
这是假设没有像Name2 45
这样的字符串
const str = "12.3,Name1,3,4,Name2,35,Name3";
console.log(str.match(/bd+.?d*b/g))