トップページに戻る
次の正規表現パズルへ
前の正規表現パズルへ
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