【问题标题】:JavaScript: Can I use the filter function with regular expressions?JavaScript:我可以在正则表达式中使用过滤器功能吗?
【发布时间】:2018-04-20 17:58:43
【问题描述】:

我试图找到一个类似的问题以避免创建重复,但我找不到,但如果我错过了任何问题,我深表歉意。我刚开始学习如何编码,我遇到了这个问题:

对于 JavaScript,我想使用过滤器数组方法 (https://www.freecodecamp.org/challenges/filter-arrays-with-filter) 以及所有非字母数字字符的通用表达式。

例如:

var newArray = oldArray.filter(function(val) {

return val !== /[\W_]/g;

});

我可以这样做吗?在 mozilla 指南 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions) 中,它提到您可以将正则表达式与替换一起使用,我知道该怎么做,但它根本没有提到过滤器。

再举一个不太抽象的例子,这是我正在处理的代码:

function palindrome(str) {
  
  var splitStr = str.split("");
  
  var filterArray = splitStr.filter(function(val) {
    
    return val !== /[\W_]/g;
  });
  
  return filterArray;
}

palindrome("ey*e");

如果到目前为止我的操作正确,该函数应该返回 [“e”, “y”, “e”]。但它返回 [“e”, “y”, “*”, “e”] (好像我根本没有过滤它)。我只是想知道我的代码是否有错误,或者是否根本无法将过滤器与正则表达式一起使用。

如果是这样,为什么?为什么不能将过滤器与正则表达式一起使用!?为什么我们必须使用替换?

【问题讨论】:

  • 也许您正在寻找正则表达式.test 方法?例如:return /[\W_]/g.test(val)?
  • 为什么不直接使用 "ey*e".replace(/[\W_]/g, "")
  • CRice,谢谢你的回答!这正是我一直在寻找的:)
  • juvian,感谢您的帮助,但我想找到一种使用过滤器而不是替换的方法(只是因为我很想找到替换的替代方法)。但无论如何感谢,因为替换是一个有效的答案!

标签: javascript regex replace filter


【解决方案1】:

这确实不是与 .filter() 相关的问题,只是您没有根据正则表达式正确测试字符串。

要根据正则表达式测试字符串,请使用 .test() 方法:

function palindrome(str) {
  
  var splitStr = str.split("");
  
  var filterArray = splitStr.filter(function(val) {
    
    // Test the string against the regular expression
    // and test for no match (whole thing is preceeded by !)
    return !/[\W_]/g.test(val);
  });
  
  return filterArray;
}

console.log(palindrome("ey*e"));

【讨论】:

  • 嗨斯科特马库斯!非常感谢您的回答!这正是我想做的! :)
【解决方案2】:

与其先将字符串拆分为字符,然后测试每个字符,不如直接获取字符串的所有匹配项?

function palindrome(str) {
  return str.match(/[a-zA-Z0-9]/g) || [];      
}

let chars = palindrome("ey*e");
console.log(chars);

关于使用的正则表达式:\W[^\w][^a-zA-Z0-9_] 相同。所以,[\W_] 等价于[a-zA-Z0-9]

【讨论】:

  • 嗨,托马斯!事实上,这是一个我没有考虑过的简单得多的解决方案。谢谢你的帮助!我没有选择它作为正确的答案,因为主要是因为我想学习如何将正则表达式与过滤器一起使用,但我非常感谢您的回答,因为它教会了我另一种解决问题的方法。谢谢!
猜你喜欢
  • 2011-02-06
  • 2010-09-29
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多