簡體   English   中英

計算字符串中重復的字母

[英]Count repeated letters in a string

我遇到了以下問題:我需要在字符串中找到重復的字符。 基本上我想要的是像那樣匹配的正則表達式

hello - ["ll"];
here  - ["ee"];
happiness   -  ["pp","ss"];
pupil  -  ["pp"];

我有一個匹配連續重復字符的

  /([a-z])\1+/g

也是將匹配重復字符以及它們之間的所有內容的那個

   /([a-z])(?:.*)\1+/g

但想不出正確的。

您可以使用

([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' ]

對於您的情況,您的第二個解決方案似乎更好。 您可以通過其他捕獲組獲取第二個字母

你是正則表達式(這是你的第二個正則表達式,有更多一個捕獲組):

/([a-z])(?:.*)(\1)+/g

 var re = /([az])(?:.*)(\\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>

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"]來獲取任何特定字母的出現次數。

比 RegExp 解決方案更復雜,但它可以正確處理bananaassassin ,其中有兩組重疊的字符。

這確實使使用array.maparray.filterarray.reduce ,這意味着此確切解決方案不支持<= IE8,但是它可以很容易地polyfilled。

 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 />');
 <div id="results"></div>

 var re = /([az])(?:.*)(\\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>

這個方法也很好用!!

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}

function charCount(str){
    let arr = str.split('');
    return arr.reduce((a,p)=>{
        a[p] = a[p] ? (a[p]+1) : 1;
        return a;
    },{});
};
//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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM