2012-04-23 51 views
2

我正在研究腳本以創建聯機作者標識的度量標準。我在文獻中遇到的一件事是計算每個字母的頻率(多少個a,多少個b等),而不考慮大寫或小寫。因爲我不想爲每封信創建一個單獨的聲明,所以我試圖循環這個事情,但我無法弄清楚。我能夠想到的最好的方法是將ASCII字母代碼轉換爲十六進制,然後...希望奇蹟發生。正則表達式用於在JavaScript循環中提取單獨的字母

到目前爲止,我已經得到了

element = id.toLowerCase(); 
var hex = 0; 
for (k=97; k<122; k++){ 
    hex = k.toString(16); //gets me to hex 
    letter = element.replace(/[^\hex]/g, "")//remove everything but the current letter I'm looking for 
    return letter.length // the length of the resulting string is how many times the ltter came up 
} 

當然的,但是,當我做到這一點,它解釋爲十六進制的字母H^E X,不是我想要的字母的十六進制代碼。

+0

這不是最好的方法;看看@ElliotBonneville的答案。但要回答具體問題,如果要從變量組件構建正則表達式,請使用'new RegExp(string)'而不是正則表達式:'var hexRegex = new RegExp(「[^ \\」+ hex +「] 「,」g「);' – 2012-04-23 19:03:14

+0

@MarkReed:您可能需要[escape](http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript/3561711# 3561711)你的字符串,如果你想這樣做與一般字符。 – hugomg 2012-04-23 19:15:54

回答

5

不知道爲什麼你會想轉換爲十六進制,但你可以遍歷字符串的字符並跟蹤每一個有多少次出現了用作散列對象:

var element = id.toLowerCase(); 
var keys = {}; 

for(var i = 0, len = element.length; i<len; i++) { 
    if(keys[element.charAt(i)]) keys[element.charAt(i)]++; 
    else keys[element.charAt(i)] = 1; 
} 

你可以使用數組來做同樣的事情,但散列速度更快。

+0

如果您喜歡使用數字代碼,您也可以使用element.charCodeAt()。 – hugomg 2012-04-23 19:01:50

+0

真的沒有理由,因爲你只需要轉換回去查看哪個字符是哪個字符,但是是的,這很容易實現。 – 2012-04-23 19:06:03

+0

哇。這比我所嘗試的要多得多。我來自Matlab和mathematica背景,所以這種方式從來沒有發生過我。謝謝。 – bigbenbt 2012-04-24 18:30:47

相關問題