在JavaScript中使用谓词函数进行匹配



注意:这是我关于StackOverflow的第一个问题(尽管我以前已经回答过(。如果你认为我还没有澄清什么,请在评论中告诉我。

您可能听说过JavaScript中的String.prototype.match()函数,它在字符串中搜索与正则表达式的匹配项,并将匹配项作为Array对象返回。这里有一个例子:

var str = "(list 1 2 foo (list nice 3 56 989 asdasdas))"
console.log(str.match(/d+/g)) //=>["1", "2", "3", "56", "989"]

但是,我需要一个类似匹配的方法,该方法在JavaScript中输入一个函数。这个输入函数将接收原始字符串的子字符串,并输出一个布尔值,告诉该子字符串是否有效匹配。以下是的预期行为示例

function standardFunc(substr) {
return parseFloat(substr) !== NaN;
}
var str = "(list 1 2 foo (list nice 3 56 989 asdasdas))"
console.log(str.match(standardFunc)) //=>["1", "2", "3", "56", "989"]

有没有一种简单的方法可以在JavaScript中模拟这种行为?

如果您可以设置或以某种方式识别匹配的子字符串的边界,这是可能的。例如,在这里,每个匹配看起来都以单词边界开始和结束:

function standardFunc(str) {
return !Number.isNaN(parseFloat(str))
}
const str = "(list 1 2 foo (list nice 3 56 989 asdasdas))";
for (const match of str.matchAll(/b.+?b/g)) {
if (standardFunc(match[0])) {
console.log(match[0]);
}
}

请注意,您需要使用Number.isNaN而不是!== NaN

如果你不是在寻找一个通用的解决方案,而只是一个解决这个特定问题的方案,那么只需使用regex即可解决这个问题。匹配后面跟着可选小数点和更多数字的数字:

function standardFunc(str) {
return !Number.isNaN(parseFloat(str))
}
const str = "123.03 (list 1 2 foo (list nice 3 56 989 asdasdas))";
console.log(
str.match(/d+(?:.d+)?/g)
);

在将字符串转换为数组后,我将使用Array.prototype.filter方法:

var stg = "(list 1 2 foo (list nice 3 56 989 asdasdas))";
var stgAsArray = stg.split(' ');
var numbersFromString = stgAsArray.filter(word => !Number.isNaN(parseFloat(word)));
console.log(numbersFromString)
console.log(numbersFromString.join(' '));

最新更新