捕获不相邻的重复字母

时间:2015-02-13 09:07:12

标签: javascript regex

如何捕获 abababa = 2匹配( a b 重复)等字词中的重复字母

我知道如何在字母相邻的情况下这样做 /(\ w)\ 1 + /

由于

2 个答案:

答案 0 :(得分:0)

尝试使用此 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 =&gt; (空字符串)
  • aa =&gt;一个
  • bb =&gt; B'/ LI>
  • abab =&gt; AB
  • abb =&gt; B'/ LI>
  • aab =&gt;一个
  • bab =&gt; B'/ LI>

答案 1 :(得分:0)

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

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);