【问题标题】:Return a word from a string从字符串中返回一个单词
【发布时间】:2018-05-14 16:26:36
【问题描述】:

我有一个由 3 个单词组成的字符串 'walking running swimmming',我只想返回那些有双字母的字符串。好吧,我找到了如何做到这一点的解决方案,但我坚持将单词分开。有任何想法吗?我试过.map(返回'不是函数'),.split()。也许我做错了什么?

P.S. var repeats = /([a-zA-Z])\1/;

【问题讨论】:

  • “游泳”算双字母吗?是严格的双字母吗,连续 3 个不算?还是你只是拼错了“游泳”?
  • 你也许可以用var words = 'walking running swimmming'.Split(' ');分割单词

标签: javascript arrays string dictionary split


【解决方案1】:

我想你想要的是这样的:

let result = 'walking running swimmming'
        .split(' ')  // turn into array
        .filter(s => /([a-zA-Z])\1/.test(s))  // filter out elements of array
        
console.log(result)

返回

["running", "swimmming"]

【讨论】:

  • 控制台仍然返回 .map 不是函数。您可以在codewars 上亲自尝试。这是我在问问题之前写的。 codepen
  • 我添加了一个sn-p。如果您的浏览器说 map/filter 不是函数,则您可能使用的是旧浏览器,或者可能以某种方式覆盖了 Array.prototype.map 而不是函数(即 Array.prototype.map = undefined; 肯定会导致地图停止工作。)
【解决方案2】:

你可以在你的字符串上运行.split(" "),然后遍历列表来执行你的检查

help if you need it

【讨论】:

    【解决方案3】:

    用空格将单词分割成一个数组。使用.filter 仅返回具有重复字母的那些。在过滤器内部,用正则表达式和.test 测试它是否有重复的字母。如果是,则返回 true,将其添加到新数组中。

    function doubles(words) {
        const arr = words.split(" ");
        return arr.filter(word => (/([a-zA-Z]).*?\1/).test(word));
    }
    
    doubles("walking running swimming");  // returns ["running", "swimming"]
    

    找到了测试的正则表达式here

    【讨论】:

      【解决方案4】:

      可能有一个性能效率更高的答案,但我可能会选择这个,因为它是极简主义的。

      'walking running swimming'
        .split(' ')
        .filter(word => /(.)\1/.test(word));
      

      说明

      String.prototype.split 返回一个单词数组。

      Array.prototype.filter 为数组的每个元素调用一个 lambda 函数。如果函数返回 true,则保留该元素,否则将其丢弃。然后返回过滤后的数组。

      RegExp.prototype.test 如果字符串与正则表达式匹配,则返回 true。

      word => ...function (word) { return ... } 的简写形式

      /(.)\1/ 是一个正则表达式,它匹配连续两次包含任何字符的字符串。如果您愿意,可以使用a-zA-Z 而不是.,如果您的字符串可能包含其他字符,则会产生不同的结果。


      因此,使用该示例字符串,会发生以下情况:

      1. 'walking running swimming' 变为 ['walking', 'running', 'swimming']
      2. 对于数组的每个元素,调用word => ... lambda。
        • walking 没有两个重复字符的序列,因此 test 将返回 false。
        • runningswimmingtest 为真。
      3. filter 返回测试为 true 的单词数组,['running', 'swimming']

      【讨论】:

        【解决方案5】:

        尝试以下方法:

        var str = 'walking running swimmming';
        var strArr = str.split(' ');
        strArr.forEach(function(word){
          if(word.match(/([A-Za-z])\1/)){
            console.log(word);
          }
        });

        【讨论】:

          【解决方案6】:

          您可以从一个字符串中获得多个匹配项(\w 匹配 [a-zA-Z0-9_]):

          console.log( 'walking running swimmming'.match(/\w*(\w)\1\w*/g) )
          
          console.log( 'walking running swimmming'.match(/[a-z]*([a-z])\1[a-z]*/gi) )

          要匹配只有 2 个重复字符的单词:

          console.log( 'walking running swimmming'.replace(/(.)\1\1+/g, 0).match(/\w*(\w)\1\w*/g) )

          【讨论】:

            【解决方案7】:

            var words = "walking running swimming".split(' ') 
            // ["walking", "running", "swimming"]
            var double_letter_words = words.filter(
                  function(w) { 
                        for (i = 0; i < w.length - 1; i++) { 
                           if (w[i] == w[i+1]) return true 
                        }; 
                        return false; }) 
             // ["running", "swimming"]
             console.log(double_letter_words);

            我应该注意,虽然我没有使用您的正则表达式(像其他答案一样),但它确实可以正确过滤单词并且比其他答案具有更好的性能,并且比正则表达式更容易维护和修改.

            https://jsperf.com/return-double-letter-words-from-string

            【讨论】:

            • 你没看问题他只想返回那些有双字母的单词
            • 他说他一直坚持将字符串拆分成单词。
            • @AdeelImran “但我坚持把单词分开”。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-29
            • 2014-01-19
            • 2020-06-06
            • 1970-01-01
            相关资源
            最近更新 更多