トップページに戻る    次の正規表現パズルへ    前の正規表現パズルへ

5-18 優先順位を持った置換

正規表現パズル

置換を使って
文字列123があれば、行を文字列123に置換する。
なければ、文字列456があれば、行を文字列456に置換する。
なければ、文字列789があれば、行を文字列789に置換する。

置換前


置換後


対象データ

123456789
456789
789
123456123789
456789456
789456
789789123
789789
999999
123333


正規表現

^(?=.*123).*(123).*$
|^(?!.*123)(?=.*456).*(456).*$
|^(?!.*123)(?!.*456)(?=.*789).*(789).*$
|^(?!.*123)(?!.*456)(?!.*789)(.*)$
を
\1\2\3\4
に置換


解説

\1\2\3\4
のいずれか1つのみに
キャプチャした文字列がセットされる正規表現になってます。
ブール代数で論理和と論理積を考えると分かりやすいでしょう。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
(?=.*123) をA
(?=.*456) をB
(?=.*789) をC

として、ブール代数で論理和を表現すると
    _     _ _     _ _ _
A + A*B + A*B*C + A*B*C =
         _ _     _
A + B + (A*B)*(C+C) =
        _ _
A + B + A*B =
        ___
A + B + A+B = 1

となります。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    _     _ _     _ _ _
A , A*B , A*B*C , A*B*C
は、どの2つの組み合わせの論理積も0となります。

例1
   _
A*(A*B) = 0

例2
 _       _ _ _
(A*B) * (A*B*C) = 0