文字列を全置換するには (replace)

Java

StringクラスのreplaceAllメソッドで正規表現を使った全置換ができる。または、replaceメソッドで単純な文字列での全置換ができる。名前からの類推に反してどちらも全置換で、2つは正規表現かどうかの違いであり、とてもまぎらわしい。

Signature:

String java.lang.String#replace(char oldCh, char newCh)
String java.lang.String#replace(CharSequence oldStr, CharSequence newStr)
String java.lang.String#replaceAll(String regex, String replacement)

oldCh 置換前の1文字を与える。oldStr には置換前の部分文字列を与える。 regex には正規表現を与え、前後を / などの記号で囲む必要はない。 1文字を1文字に置換するだけなら、replace(char oldCh, char newCh) のほうでも十分。正規表現を使うには replaceAll を使う必要がある。

java.lang.String#replace | Java Platform SE 8 Javadoc
http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replace-char-char-
http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replace-java.lang.CharSequence-java.lang.CharSequence-

java.lang.String#replaceAll | Java Platform SE 8 Javadoc
http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replaceAll-java.lang.String-java.lang.String-

正規表現の仕様 | Java Platform SE 8 Javadoc
http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#sum

PHP

preg_replace関数で正規表現を使った全置換ができる。または、str_replace関数で単純な文字列での全置換ができる。

echo preg_replace('/\n/', "<br />", "abc\nabc\n"); // => abc<br />abc<br />
echo str_replace("\n", "<br />", "abc\nabc\n");    // => abc<br />abc<br />

改行を文字列で表現するには "" で囲んで \n とする必要があるが、正規表現では、'\n' という文字列が文字列リテラルではなく正規表現解釈の段階で改めて改行と認識される。なので preg_replaceの1つ目の引数は '' でもよいが str_replaceの1つ目の引数は "" である必要がある。

preg_replace 関数 | PHP Manual
http://php.net/manual/ja/function.preg-replace.php

str_replace 関数 | PHP Manual
http://php.net/manual/ja/function.str-replace.php

Smarty

replace修飾子を使う。

{* $str に "abc" が入っているとして *}
{$str|replace:"a":"A"} {* "Abc" を表示 *}
{$str2 = $str|replace:"a":"A"} {* $str2 に "Abc" を代入 *}

replace 修飾子 | Smarty Manual
http://www.smarty.net/docs/ja/language.modifier.replace.tpl

Python

文字列にあるメソッド replace を使う。

"abc\nabc\n".replace("\n", "<br />")

string.replace | Python 2.7 documentation
http://docs.python.jp/2/library/stdtypes.html#str.replace

string.replace | Python 3 documentation
http://docs.python.jp/3/library/stdtypes.html#str.replace

Ruby

gsubメソッドまたはgsub!メソッドで正規表現を使った全置換ができる。

"abc\nabc\n".gsub(/\n/, "<br />")

2つ目の引数には、かっこでマッチした部分の参照として \1, \2 などが使える。 2つ目の引数がダブルクオーテーションで囲まれている場合は \\1, \\2 のようにエスケープする必要がある。

"abac".gsub(/a(.)/, "\\1\\1") # => "bbcc"

正規表現のみを与えて、代わりにブロックを与えると、ブロックを評価した結果に置換される。ブロックの中ではかっこでマッチした部分を $1, $2 などで参照できる。

"abac".gsub(/a(.)/) { $1 * 2 } # => "bbcc"

正規表現の代わりに文字列を与えれば、単純にその文字列と一致する部分を全置換する。

gsub は置換した結果を返し、自身は変更しない。マッチした部分がなくてもそのまま文字列を帰す。

gsub! は破壊的メソッドで、マッチした部分があれば、置換した結果を返し、自身も変更する。マッチした部分がなければ、nil を返す。

全置換ではなく、最初にマッチした部分だけを置換するには sub または sub! を使う。

Perl

以下は正規表現で全置換する例。

$str =~ s/abc/ABC/g;

=~ s/ で置換を意味し、最後のフラグ g はすべてのマッチした文字列を置換することを意味する。

上の例では abc が置換前の正規表現、ABC が置換後の文字列。置換後の文字列には、正規表現中の () でグルーピングにマッチした文字列がセットされている $1, $2… の変数が使える。

最後のフラグに e を付けると、置換後の文字列の場所にPerlのコードを書いて、置換後文字列をその場で計算させることができる。その中でサブルーチンを呼び出せば複雑な置換処理もできる。

$str =~ s/(\d+)/$1 * 2/eg;
$str =~ s/(\d+)/f($1)/eg;

置換前後の文字列が変数で与えられて、正規表現ではなく、そのまま全置換したい場合は、以下のようにするとできるようだ。

my $str = "abc[]def";
my $src = "c[]d";
my $dst = "C{}D";
my $src_regexp = quotemeta($src);

$str =~ s{$src_regexp}{$dst}g;

print $str; # => abC{}Def

quotemeta は正規表現中で特別な意味を持つかもしれない記号類をごっそりエスケープ処理してしまう関数である。

sh (シェルスクリプト)

sedコマンドのsでの置換を使うとよい。

abcABC に置換する例

cat foo.txt | sed -e 's/abc/ABC/g'

s が置換コマンドを意味し、最後の g はすべてのマッチした文字列を置換することを意味する。 g がなくても全行で置換を実行するが、1行に2つ以上マッチした場合は 1つ目しか置換されない。

置換後の文字列に & を指定するとマッチした文字列の部分が出力され、 \1, \2… を指定するとマッチした文字列のうち正規表現内でカッコでグルーピングされた部分が出力される。

グルーピングのための ()\(\) のようにバックスラッシュでエスケープが必要になる。 -e の代わりに -E を使うとこのエスケープが不要になる。

echo xx34 | sed -e 's/xx\(.\)/-& \1-/g'
# => -xx3 3-4

echo xx34 | sed -E 's/xx(.)/-& \1-/g'
# => -xx3 3-4
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。