我遇到了以下问题: 我需要在字符串中找到重复的字符。 基本上我想要的是正则表达式,它将匹配
hello - ["ll"];
here - ["ee"];
happiness - ["pp","ss"];
pupil - ["pp"];
我有一个匹配连续重复字符的那个
/([a-z])\1+/g
也可以匹配重复的字符和它们之间的所有内容,例如这个
/([a-z])(?:.*)\1+/g
但是找不到正确的那个。
答案 0 :(得分:3)
您可以使用
([a-zA-Z]).*(\1)
由于您已经明确表示您正在寻找一种解决方案来处理字符串中除双字母之外的其他内容,因此您应该使用非正则表达式方法,例如:
使用字符串中的字符数构建关联数组:
var obj={}
var repeats=[];
str='banana'
for(x = 0, length = str.length; x < length; x++) {
var l = str.charAt(x)
obj[l] = (isNaN(obj[l]) ? 1 : obj[l] + 1);
}
console.log(obj)
打印
{ b: 1, a: 3, n: 2 }
然后构建一个规范数组:
for (var key in obj) {
if (obj.hasOwnProperty(key) && obj[key]>1) {
repeats.push(new Array( obj[key]+ 1 ).join( key ));
}
}
console.log(repeats)
打印:
[ 'aaa', 'nn' ]
答案 1 :(得分:1)
var obj = {};
var str = "this is my string";
for (var i = 97; i < 97 + 26; i++)
obj[String.fromCharCode(i)] = 0;
for (var i = 0; i < str.length; i++) {
obj[str.charAt(i).toLowerCase()]++;
}
从那里你可以说obj["a"]
来获取任何特定字母的出现次数。
答案 2 :(得分:1)
对于您的方案,您的第二个解决方案似乎更好。您可以通过其他捕获组获取第二个字母
你是正则表达式(这是你的第二个RegEx,有更多的一个捕获组):
/([a-z])(?:.*)(\1)+/g
var re = /([a-z])(?:.*)(\1)+/g;
var str = ['hello', 'here', 'happiness', 'pupil'];
var m;
var result = new Array();
for(var i = 0; i < str.length; i++) {
result[i] = str[i] + "->";
while ((m = re.exec(str[i])) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
// View your result using the m-variable.
// eg m[0] etc.
result[i] += m[1];
result[i] += m[2] + ",";
}
}
document.getElementById("results").innerHTML = result.join("</br>");
<div id="results"></div>
答案 3 :(得分:1)
比RegExp解决方案更复杂,但它正确处理banana
和assassin
,其中有两个重叠的字符组。
这确实利用了array.map,array.filter和array.reduce,这意味着这个确切的解决方案并不支持&lt; = IE8,但它可以很容易地填充
function findDuplicateCharacters(input) {
// Split the string and count the occurrences of each character
var count = input.split('').reduce(function(countMap, word) {
countMap[word] = ++countMap[word] || 1;
return countMap;
}, {});
// Get the letters that were found, and filter out any that only appear once.
var matches = Object.keys(count)
.filter(function (key) { return (count[key] > 1); })
// Then map it and create a string with the correct length, filled with that letter.
.map(function (key) {
return new Array(count[key] + 1).join(key);
});
return matches;
}
var results = ['hello', 'here', 'happiness', 'pupil', 'banana'].map(findDuplicateCharacters);
document.getElementById("results").innerHTML = results.join('<br />');
&#13;
<div id="results"></div>
&#13;
答案 4 :(得分:0)
var re = /([a-z])(?:.*)(\1)+/g;
var str = ['aaaccbcdd'];
var m;
var result = new Array();
for(var i = 0; i < str.length; i++) {
result[i] = str[i] + "->";
while ((m = re.exec(str[i])) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
// View your result using the m-variable.
// eg m[0] etc.
result[i] += m[1];
result[i] += m[2] + ",";
}
}
document.getElementById("results").innerHTML = result.join("</br>");
<div id="results"></div>
答案 5 :(得分:0)
这种方法也很好!
let myString = 'abababc';
let result = {};
for (let str of myString) {
result[str] = result.hasOwnProperty(str) ? result[str] + 1 : 1;
}
console.log(result);
结果将如下所示: {a:3,b:3,c:1}
答案 6 :(得分:0)
function charCount(str){
let arr = str.split('');
return arr.reduce((a,p)=>{
a[p] = a[p] ? (a[p]+1) : 1;
return a;
},{});
};
答案 7 :(得分:0)
//Try this method
const countRepeatChar = (str) => {
let obj = {};
if (str) {
for (let i = 0; i < str.length; i++) {
if (obj[str[i]]) {
obj[str[i]] += obj[str[i]];
} else {
obj[str[i]] = 1;
}
}
console.log(obj);
}
};
countRepeatChar("aabcddeee");