【问题标题】:Capture non-adjacent repeating letters捕获不相邻的重复字母
【发布时间】:2015-02-13 09:07:11
【问题描述】:

我如何捕捉像 abababa = 2matches(ab 重复)这样的单词中的重复字母

当字母相邻时我知道该怎么做 /(\w)\1+/

谢谢

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    尝试使用这个 String 扩展:

    String.prototype.getRepeating = function() {
      var length = this.length;
      var found = '';
      var repeating = '';
      var index;
      var letter;
      for (index = 0; index < length; index++) {
        letter = this.charAt(index);
        if (-1 == found.indexOf(letter)) {
          found = found.concat(letter);
        } else {
          if (-1 == repeating.indexOf(letter)) {
            repeating = repeating.concat(letter);
          }
        }
      }
      return repeating;
    }
    

    测试:

    var tests = ['ab', 'aa', 'bb', 'abab', 'abb', 'aab', 'bab'];
    for (var index in tests) {
      console.log(tests[index], '=>', tests[index].getRepeating());
    }
    
    • ab =>(一个空字符串)
    • aa => 一个
    • bb => b
    • abab => ab
    • abb => b
    • aab => 一个
    • bab => b

    【讨论】:

      【解决方案2】:

      如果我理解正确,您想提取在给定单词中出现多次的字母。如果是这样,您只需遍历单词的字母,累积它们的出现次数,然后过滤掉只出现一次的字母。

      var testString = "abababa";
      var letters = countGroupByLetter(testString);
      var result = filterMap(letters, function(v) {
        return v > 1;
      });
      console.log(result);
      
      function countGroupByLetter(testString) {
        var result = {};
        for (var ii = 0; ii < testString.length; ii++) {
          var letter = testString.charAt(ii);
          if (result[letter]) {
            result[letter] ++;
          } else {
            result[letter] = 1;
          }
        }
        return result;
      }
      
      function filterMap(map, filterFunction) {
        var result = {};
        for (var p in map) {
          if (filterFunction(map[p])) {
            result[p] = map[p];
          }
        }
        return result;
      }

      既然您已经知道反向引用,我想您知道您可以使用/(\w).*\1/ 找出字符串中是否有字母重复。但是,不可能一次捕获所有重复,您仍然需要重复执行一个模式并累积匹配的字符(例如使用/(\w)(?=.*\1)/g)。然而,这并不是最优的。

      var repeatingLetters = /(\w)(?=.*\1)/g;
      var testString = "abababa";
      var captures = null;
      var result = {};
      while ((captures = repeatingLetters.exec(testString)) != null) {
        result[captures[1]] = true;
      }
      console.log(result);

      【讨论】:

        猜你喜欢
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        • 1970-01-01
        • 2014-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多