есть ли способ использовать tr/// (или эквивалент) в java?

Я хотел бы знать, есть ли эквивалент tr/// (используемый в Perl) в Java. Например, если бы я хотел заменить все "s" на "p" в слове "mississippi" и наоборот, я мог бы на 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);

Есть лучший способ сделать это?

Заранее спасибо.


person Limao Luo    schedule 17.09.2011    source источник
comment
этот пост может помочь stackoverflow.com /вопросы/3254358/   -  person    schedule 18.09.2011


Ответы (3)


replaceChars может быть вашим лучшим выбором. Насколько я знаю, в JDK нет замены (ar ar).

person Dave Newton    schedule 17.09.2011

В зависимости от того, насколько статична ваша замена, вы можете сделать

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.

person hmakholm left over Monica    schedule 17.09.2011

Как уже указывал @Dave, ближайшей заменой является

Apache Commons StringUtils.replaceChars(String str, String searchChars, String 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"
...
person chrisb    schedule 05.02.2018