16

我想知道Java中是否有与 tr/// (在 Perl 中使用的)等价的东西。例如,如果我想用“mississippi”中的“p”替换所有“s”,反之亦然,我可以在 Perl 中写

#shebang and pragmas snipped...
my $str = "mississippi";
$str =~ tr/sp/ps/;  # $str = "mippippissi"
print $str;

我能想到在Java中做到这一点的唯一方法是在该String.replace()方法中使用一个虚拟字符,即

String str = "mississippi";
str = str.replace('s', '#');   // # is just a dummy character to make sure
                               // any original 's' doesn't get switched to a 'p'
                               // and back to an 's' with the next line of code
                               // str = "mi##i##ippi"
str = str.replace('p', 's');   // str = "mi##i##issi"
str = str.replace('#', 'p');   // str = "mippippissi"
System.out.println(str);

有一个更好的方法吗?

提前致谢。

4

3 回答 3

5

Commons 的replaceChars可能是你最好的选择。AFAIK JDK 中没有替代品(ar ar)。

于 2011-09-17T21:36:35.693 回答
1

根据您的替代品的静态程度,您可以这样做

char[] tmp = new char[str.length()];
for( int i=0; i<str.length(); i++ ) {
  char c = str.charAt(i);
  switch( c ) {
    case 's': tmp[i] = 'p'; break;
    case 'p': tmp[i] = 's'; break;
    default: tmp[i] = c; break;
  }
}
str = new String(tmp);

如果替换需要在运行时发生变化,您可以使用表查找替换开关(如果您知道需要替换的所有代码点都在有限范围内,例如 ASCII),或者,如果其他一切都失败了,则使用 hashmap从CharacterCharacter

于 2011-09-17T21:49:52.640 回答
0

正如@Dave 已经指出的那样,最接近的替代品是

Apache Commons StringUtils.replaceChars(字符串 str,字符串 searchChars,字符串 replaceChars)

描述摘录:

...
StringUtils.replaceChars(null, *, *)           = null
StringUtils.replaceChars("", *, *)             = ""
StringUtils.replaceChars("abc", null, *)       = "abc"
StringUtils.replaceChars("abc", "", *)         = "abc"
StringUtils.replaceChars("abc", "b", null)     = "ac"
StringUtils.replaceChars("abc", "b", "")       = "ac"
StringUtils.replaceChars("abcba", "bc", "yz")  = "ayzya"
StringUtils.replaceChars("abcba", "bc", "y")   = "ayya"
StringUtils.replaceChars("abcba", "bc", "yzx") = "ayzya"
...
于 2018-02-05T17:28:15.140 回答