Java 具有.ReplaceAll的多个条件

Java 具有.ReplaceAll的多个条件,java,replaceall,Java,Replaceall,有没有办法向.replaceAll添加多个条件? 现在,我正在尝试将手机上的字母转换为与使用.replaceAll相关的数字。 到目前为止,这个片段看起来像 Scanner kbIn = new Scanner(System.in); System.out.print("Enter the phone number: "); String fakeNum = kbIn.nextLine().toLowerCase(); String returnNum = fakeNum.replaceA

有没有办法向.replaceAll添加多个条件? 现在,我正在尝试将手机上的字母转换为与使用.replaceAll相关的数字。 到目前为止,这个片段看起来像

Scanner kbIn = new Scanner(System.in);

System.out.print("Enter the phone number: ");

String fakeNum = kbIn.nextLine().toLowerCase();

String returnNum = fakeNum.replaceAll("[abc]", "2");
因此,当您输入a、b或c时,它会在输出中将其更改为“2”。我的问题是-你能在一行中设置多个这样的条件吗?假设我想在打印时将d、e和f转换为3。我能做点像这样的事吗

String returnNum = fakeNum.replaceAll("[abc]", "2" && "[def]", "3");

我知道这是行不通的——我只是用布尔运算符来表示,我试图在fakeNum上处理这两个条件。有办法做到这一点吗?非常感谢

我看到的一个选项是链接
replaceAll()
调用,如下所示:

String returnNum = fakeNum.replaceAll("[abc]", "2").replaceAll("[def]", "3");

将调用链接到
replaceAll()
将起作用,但您将扫描字符串8次。我会用老式的方式迭代字符串:

public static String replaceDtmf(String str)
{
    if (str == null || str.isEmpty()) {
        return str;
    }

    StringBuilder result = new StringBuilder();

    for (int i = 0; i < str.length(); i++) {
        switch (Character.toUpperCase(str.charAt(i))) {
            case 'A':
            case 'B':
            case 'C':
                result.append('2');
                break;
            case 'D':
            case 'E':
            case 'F':
                result.append('3');
                break;
            case 'G':
            case 'H':
            case 'I':
                result.append('4');
                break;
            case 'J':
            case 'K':
            case 'L':
                result.append('5');
                break;
            case 'M':
            case 'N':
            case 'O':
                result.append('6');
                break;
            case 'P':
            case 'Q':
            case 'R':
            case 'S':
                result.append('7');
                break;
            case 'T':
            case 'U':
            case 'V':
                result.append('8');
                break;
            case 'W':
            case 'X':
            case 'Y':
            case 'Z':
                result.append('9');
                break;
            default:
                result.append(str.charAt(i));
                break;
        }
    }

    return result.toString();
}
publicstaticstringreplacedtmf(stringstr)
{
if(str==null | | str.isEmpty()){
返回str;
}
StringBuilder结果=新建StringBuilder();
对于(int i=0;i
根据肖恩·布莱特的回答,这将“将手机上的字母转换为与之相关的数字”,如问题中所述

我经常通过快速索引查找来解决问题,其中switch语句也可以工作,但如果您处理的是default/“否则”情况,则switch(通常)更合适

私有静态最终字符[]键={
'2','2','2',//A B C
'3','3','3',//D E F
'4','4','4',//G H I
'5','5','5',//jkl
'6','6','6',//不适用
‘7’、‘7’、‘7’、//P Q R S
‘8’、‘8’、‘8’、//T U V
'9','9','9','9'//W X Y Z
};
公共静态字符串替换DTMF(字符串str)
{
if(str==null | | str.isEmpty()){
返回str;
}
str=str.toUpperCase();
StringBuilder结果=新建StringBuilder();
对于(int i=0;i=0&&index

请参见。

为什么要在一个操作中执行多个操作?你认为连锁电话太冗长了吗?谢谢!这也很好,但在我的例子中,链接它们也很有效。因此,尝试转换
1-800-AWESOME
将引发
索引自动边界异常
?你是故意这么做的吗?所以,这不是生产代码;只是演示索引方法——但如果你坚持;好吧,从我阅读你答案的方式来看,抛出异常似乎是一项功能。我现在明白了。@Sean这一切都取决于目的。。。然而,如果我想让它在任何被认为是不可翻译的东西上抛出一个异常,我可能会使用模式匹配,如果输入是“坏的”,则抛出IllegalArgumentException。
private static final char[] keys = {
                                    '2', '2', '2',      // A B C
                                    '3', '3', '3',      // D E F
                                    '4', '4', '4',      // G H I
                                    '5', '5', '5',      // J K L
                                    '6', '6', '6',      // M N O
                                    '7', '7', '7', '7', // P Q R S
                                    '8', '8', '8',      // T U V
                                    '9', '9', '9', '9'  // W X Y Z
                            };

public static String replaceDtmf(String str)
{
    if (str == null || str.isEmpty()) {
        return str;
    }

    str = str.toUpperCase();
    StringBuilder result = new StringBuilder();

    for (int i = 0; i < str.length(); i++) {
        int index = str.charAt(i) - 'A';
        if (index >= 0 && index < keys.length) {
            result.append( keys[ index ] );
        }
        else {
            result.append( str.charAt(i) );
        }
    }

    return result.toString();
}