2017-10-26 6 views
1

単一のRegExを使用して異なるパターンに基づいて異なる文字を置き換えることは可能ですか?あなたは次の文字列がある場合たとえば、:単一のRegEx in。Netを複数回置き換えたもの

iOoi9345

を、あなたは上の0(ゼロ)による小規模または資本手紙かどうか、1で任意のIさんを交換し、任意のOの言うことは、単一の正規表現を書くことができます文字列全体、または複数のステップで行う必要がありますか?

これは私がUIを構築していることと、パターン用とそれを置き換える値用の2つのテキストボックスを用意するだけで十分かどうかを知りたいのです各自のユースケースを扱う複数のRegExが定義されているリストを提供する必要がありますか?

フィードバックに感謝します。

おかげ

答えて

0

あなたはマッピング辞書を作成し、あなたの交換を定義することができます...

// say this is your input, to define the replacement convention 
string uiTextBox = "i:1, I:1, o:0, O:0"; 

string[] conversion = uiTextBox.Split(new char[] { ',' }); 
IDictionary<string, string> map = new Dictionary<string, string>(); 
foreach (string rule in conversion) 
{ 
    string[] r = rule.Trim().Split(new char[] { ':' }); 
    map.Add(r[0], r[1]); 
} 

/* map would contain, {"{i, 1}, {I, 1}, {o, 0}, {O, 0}"} */ 
var str = "aiAIboBOCDEF"; 
var regex = new Regex(String.Join("|", map.Keys)); 
var replaceStr = regex.Replace(str, m => map[m.Value]); 
+0

以下のコメントと同じですが、UIを使用して変更できるように柔軟にしておく必要があるため、ハードコードされたものはありません。 – Thierry

+0

私の更新された答えを確認してください、あなたの入力がルールを定義している場合、あなたは単一の正規表現を使用してそれらを置き換えることができます...これが助けになるかどうか分かりませんか? – Sarhang

+1

私は、以下に述べるように再帰関数を使い、とてもうまく作業していますので、それを使ってもっと多くのことを行うことができます(置換、分割、部分文字列など)。質問、私はあなたに答えを与えるでしょう。再度、感謝します! – Thierry

3

あなたは、.NET正規表現を使用して、条件付き置換を指定することはできません。

しかし、あなたは、デリゲートとRegex.Replaceを使用することができます。

Regex.Replace("iOoi9345", "i|[Oo]", m => m.Value == "i" ? "1" : "0") 
+0

知って良いことだそれが、これはただの一つであるとして、私のユースケースではおそらく適切ではないでしょうし、おそらく複数の正規表現を定義するためのリストを提供したり、単純なカスタムスクリプト言語を提供したり、再帰を使用したりする必要があります。 Replace(myvalue、O、0)、i、1)のようなものがあり、再帰を使用します。 – Thierry

関連する問題