【发布时间】:2015-02-13 09:07:11
【问题描述】:
我如何捕捉像 abababa = 2matches(a 和 b 重复)这样的单词中的重复字母
当字母相邻时我知道该怎么做 /(\w)\1+/ 。
谢谢
【问题讨论】:
标签: javascript regex
我如何捕捉像 abababa = 2matches(a 和 b 重复)这样的单词中的重复字母
当字母相邻时我知道该怎么做 /(\w)\1+/ 。
谢谢
【问题讨论】:
标签: javascript regex
尝试使用这个 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());
}
【讨论】:
如果我理解正确,您想提取在给定单词中出现多次的字母。如果是这样,您只需遍历单词的字母,累积它们的出现次数,然后过滤掉只出现一次的字母。
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);
【讨论】: