文字列で置き換える必要がある文字列のマップ (ペアのコレクション) があります。
たとえば{ {"foo", "foo2"}, {"bar", "bar2"} }
、文字列の最終結果をマップした場合、次のように"foo barman football bar"
なります"foo2 bar2man foo2tball bar2"
。
すでに多くの質問/回答がありますが、ここでの最大の問題について言及しているものはありません。マップに「循環」置換がある場合{ {"foo", "bar"}, {"bar", "foo"} }
、結果は次のようになります"bar fooman bartball foo"
。
別の問題が考えられます{ {"foo", "fo"}, {"fo", "f"} }
アルゴリズムは、インスタンスを 1 回だけ置換する必要があります。
SSCCE を提供できなくて申し訳ありません...私はまだそれにアプローチする方法を探しています。
オプション1:
マップをキー サイズ (降順) で並べ替えます。これにより、包含の問題が解消されます。
次に、従来のスワップ アプローチに由来するアイデアに基づきます。マップを調べて、出現するすべてのキーを一意のものに置き換えます。私の場合、2番目のキーなどの最初のキーには?
使用できませんでした。?1
?2
2 番目のパス?1
では、値 1、?2
値 2 などに置き換えます。
短所: 1. どのキーまたは値とも一致しないスワップ キーを定義する簡単な方法が必要です。2.パフォーマンスが高価に見える
オプション 2:
と言う一般的な一致パターンを作成します((key1|key2|key3...)(.*?))*
。一致を列挙し、キーが一致するたびにキーを値に置き換えます。結果を再生成します。
短所: 1. マッチング ツリーの作成にメモリがかかる可能性がある 2. 一般的なパターンの準備が面倒になる可能性がある