2015-10-22 37 views
0

如何使用正則表達式查找最大中一個字的重複字母數量? 重複的字母可以用其他字母分隔,如「備忘錄」:'m'用'e'分隔。 例如:單詞「最大」應該返回2,導致'e'或't'重複兩次,兩次是最大重複次數。 我試過像/([a-z]{1,})\1/這樣的模式,但它不適用於這種情況。 預先感謝您。查找Javascript中某個單詞中重複字母的最大數量

+0

所以在你的例子中是2返回的,因爲最大值是2,還是因爲2個字母最大? ...換句話說,應該備忘錄返回1或2 ... ...,我懷疑正則表達式可以做你想要的任何一種情況下 –

+0

@JaromandaX'備忘錄'應該返回2.只是返回最大值,抱歉混淆。 – AndyHu

+4

爲什麼你需要這個正則表達式?它們通常不用於數數。 – samsonthehero

回答

3

這是完成此操作的JavaScript方式。這樣做正則表達式是不可能的。

var exp = 'hello world' ; 
var expCounts = {}; 
var maxKey = ''; 
for(var i = 0; i < exp.length; i++) { 
    var key = exp[i]; 
    if(!expCounts[key]){ 
    expCounts[key] = 0; 
    } 
    expCounts[key]++; 
    if(maxKey == '' || expCounts[key] > expCounts[maxKey]){ 
     maxKey = key; 
    } 
} 

console.log(maxKey + ":" + expCounts[maxKey]); //logs l:3 

的jsfiddle

https://jsfiddle.net/v72qa872/

2

這裏是另一種方式與JavaScript來做到這一點:

function greatestRepeat(str) { 
 
    var maxRepeat = 0; 
 
    var letterRepeated = null; 
 
    for(var i=0; i<str.length; i++) { 
 
    \t var currentLetter = str.charAt(i); 
 
     var timesRepeated = str.split(currentLetter).length-1; 
 
     if(timesRepeated > maxRepeat) { 
 
      maxRepeat = timesRepeated; 
 
      letterRepeated = currentLetter; 
 
     } 
 
    } 
 
    return letterRepeated; 
 
} 
 
console.log(greatestRepeat("memo"));

正如我在評論中提到的,這不能純粹用正則表達式來完成。由於@MillieSmith聲明這是因爲常規語言無上下文。

+0

這不起作用。例如,'greatestRepeat(「aabbbcc」)'返回'a',而不是'b'。我不太清楚「split」中的分界線是在做什麼? –

+0

@torazaburo固定的,帶有split的行獲取該字符的當前重複次數。我在編輯時意外地將它從'str'改爲'currentLetter',但沒有注意到。 –

2

如何使用正則表達式在JavaScript中查找單詞中重複字母的最大數量?

你不能,除非你願意來限制重複的最大數量,在這種情況下,你可以用下面這樣做:

regexp = /(?:.*(.)(?:.*\1){2})|(?:.*(.)(?:.*\2){1})/ 
      ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^ 
      MATCH 2 REPETITIONS MATCH ONE REPETITION 

這是一個最大的兩個重複的情況下(三次出現相同的字符)。它的作用是查找特定字符序列的第一個匹配項((.)),然後再次查找任何和該字符(.*\1),重複兩次;換句話說,角色出現三次。如果不匹配,那麼它會找到一個特定字符序列的第一個匹配,然後是任何和該字符,重複一次;換句話說,角色出現兩次。您可以將其擴展至允許的最大重複次數(9,因爲AFAIK後向引用僅支持單個數字)。

如果您使用此作爲

match = 'aabbbcc'.match(regexp) 

那麼正確答案("b")將在match[1]。如果沒有重複,則撥打match將失敗。

+0

......除非你有一個像.NET一樣的「正則表達式」引擎,它可以計算重複的捕獲......'(。)(?=(?:。*?(\ 1))+)',連同'.Matches ()'會返回一個匹配列表,每個匹配包含一個捕獲列表;你只需要找到最長的一個。好的,這是在正則表達式引擎之外需要的額外步驟,但非常接近。無論如何,正則表達式絕對不是正確的工具。 –

相關問題