JavaScript Regex到Java Regex - 替换和Lambdas

时间:2010-09-16 19:47:59

标签: java javascript regex replace

将此代码转换为Java的最佳方法是什么? (称为将字母数字电话号码转换为所有数字的部分) http://lawrence.ecorp.net/inet/samples/regexp-format.php

由于Java还没有lambda ... String.replace的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

哇,原始代码有点过于冗长。我会这样做:

return phoneStr.replace(/[a-zA-Z]/g, function(m) {
    var ix= m[0].toLowerCase().charCodeAt(0)-0x61; // ASCII 'a'
    return '22233344455566677778889999'.charAt(ix);
});

因此在Java中,类似于:

StringBuffer b= new StringBuffer();
Matcher m= Pattern.compile("[A-Za-z]").matcher(phoneStr);
while (m.find()) {
    int ix= (int) (m.group(0).toLowerCase().charAt(0)-'a');
    m.appendReplacement(b, "22233344455566677778889999".substring(ix, ix+1));
}
m.appendTail(b);
return b.toString();

用Java的Matcher替换是笨拙的,你可能更喜欢在这种情况下使用数组:

char[] c= phoneStr.toLowerCase().toCharArray();
for (int i= 0; i<c.length; i++)
    if (c[i]>='a' && c[i]<='z')
        c[i]= "22233344455566677778889999".charAt((int) (c[i]-'a'));
return new String(c);

答案 1 :(得分:1)

执行此操作的一个非常基本的方法是:

String replaceCharsByNumbers(String stringToChange) {
    return stringToChange
            .replace('a', '2')
            .replace('b', '2')
            .replace('c', '2')
            .replace('d', '3')
            .replace('e', '3')
            .replace('f', '3')
            .replace('g', '4')
            .replace('h', '4')
            .replace('i', '4')
            .replace('j', '5')
            .replace('k', '5')
            .replace('l', '5')
            .replace('m', '6')
            .replace('n', '6')
            .replace('o', '6')
            .replace('p', '7')
            .replace('q', '7')
            .replace('r', '7')
            .replace('s', '7')
            .replace('t', '8')
            .replace('u', '8')
            .replace('v', '8')
            .replace('w', '9')
            .replace('x', '9')
            .replace('y', '9')
            .replace('z', '9');
}