2012-04-23 24 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