16

Java で (Perl で使用されている) tr/// に相当するものがあるかどうかを知りたいです。たとえば、"mississippi" のすべての "s" を "p" に、またはその逆に置き換えたい場合、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が最善の策かもしれません。私の知る限り、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 などの限られた範囲に収まることがわかっている場合) に置き換えるか、他のすべてが失敗した場合はハッシュマップに置き換えることができます。からCharacterまでCharacter

于 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 に答える