2017-06-26 5 views
2

私は単純な文字列を置き換えて特定の単語を探し、何か他のものに置き換えます。 BLAと値 - - 私はキーがあれば
すなわちブーイングを、以下今Regex replace - リンクの内容を無視する

var input ="bla bla test test1 test3..."; 

foreach (var obj in dictionary) 
{ 
    inputText = Regex.Replace(inputText, obj.Key, obj.Value); 
} 

var output = "boo boo test test1 test3..."; 

は、私は、HTMLの入力がTEST1 TEST3

「のblaのblaテストすることができ、今入力として来ている生成します移動します。 「

として終わる "をwww.something.com/bla/somethingにブーイングテストTEST1のTEST3をブーイング。"

をwww.something.com/boo/somethingに行きます1

(このコンテンツはHTML形式で表示されます)

ここでは、URL内の置換えをスキップして、URL以外の置換えを行います。可能なことですか

答えて

1

はい、URLのように見える部分文字列を一致させ、そのテキストを保持してください。そうでなければ、置換を実行してください。

コードは、私がRegex.Escape(obj.Key)obj.Keyに潜在的な特殊文字をエスケープするRegex.Escapeを使用

inputText = Regex.Replace(inputText, [email protected]"\b(https?://\S+|www\.\S+)|{Regex.Escape(obj.Key)}", m => 
        m.Groups[1].Success ? m.Groups[1].Value : obj.Value); 

ノートのようになります。

\b(https?://\S+|www\.)は単語全体(\bは、ワード境界であるように)http又はhttps、次いで://と1+非空白文字またはwww.と1+非空白文字に一致します。したがって、正規表現がURLと一致する場合はm.Groups[1]に入り、一致エバリュエーターの中で置換は同じURLテキストになります。そうでない場合、obj.Valueが置換テキストとして使用されます。

このアプローチでは、同じテキストを2回以上置き換えることには別の問題があります。次に、あなたの辞書のキーに基づいて、正規表現を作成してから、マッチエバリュエーターを使用して、キーの一致に基づいて適切な値を取得する必要があります。

だから、私は

var dct = new Dictionary<string, string>(); 
dct.Add("bla", "boo"); 
dct.Add("bla test", "ZZZ"); 
var pat = [email protected]"\b(https://\S+|www\.\S+)|(?:{string.Join("|",dct.Keys.Select(k => Regex.Escape(k)).OrderByDescending(x => x.Length))})"; 
// Console.WriteLine(pat); => \b(https://\S+|www\.\S+)|(?:bla\ test|bla) 
var input ="bla bla test test1 test3. Go to www.something.com/bla/something"; 
var output = Regex.Replace(input, pat, m => m.Groups[1].Success ? m.Groups[1].Value : dct[m.Value]); 
Console.Write(output); 
// => boo ZZZ test1 test3. Go to www.something.com/bla/something 

のようなものをお勧めしますC# demoを参照してください。