多个条件 with.ReplaceAll
Multiple conditions with.ReplaceAll
有什么方法可以将多个条件添加到 .replaceAll 中吗?
现在我正在尝试将 phone 上的字母转换为与使用 .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();
}
Sean Bright 的回答分支,这将 "convert the letters on a phone to the numbers they correlate to" 如问题中所述。
我经常通过快速索引查找来解决问题,其中 switch 语句也可以工作,但如果您正在处理默认/"otherwise" 情况,switch(通常)更合适。
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();
}
在 IDEone 上查看。
有什么方法可以将多个条件添加到 .replaceAll 中吗? 现在我正在尝试将 phone 上的字母转换为与使用 .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();
}
Sean Bright 的回答分支,这将 "convert the letters on a phone to the numbers they correlate to" 如问题中所述。
我经常通过快速索引查找来解决问题,其中 switch 语句也可以工作,但如果您正在处理默认/"otherwise" 情况,switch(通常)更合适。
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();
}
在 IDEone 上查看。