2016-04-05 15 views
0

文字列内の特定の行を削除するループがあります。Regexループを書き直すにはどうしたらいいですか?

private static string RemoveGuidLines(string s) 
{ 
    var result = s; 

    foreach (var toRemove in GuidConstraintPartials) 
    { 
     var regex = new Regex([email protected]"^.*{toRemove}.*$", RegexOptions.Multiline); 
     result = regex.Replace(result, "GUID line removed by report generator"); 
    } 

    return result; 
} 

GuidConstraintPartialsは私の第六感は私はおそらくより良い正規表現か何かではなく、この突合せ醜いコードを使用してこの問題を解決できることを私に言っている

private static readonly string[] GuidConstraintPartials = 
    { 
     "DF__User__Support__", 
     "DF__Setti__NoteT__", 
     "DF__Note__", 
     "DF__Actor__IsDeleted__", 
     "UQ__Atta__", 
     "PK__Applicat__" 
    }; 

です。何か案は?

+0

「GuidConstraintPartials」はいくつありますか? –

+1

また、 'DF__'で始まるものは、置き換えるGUIDになりますか?あなたの正規表現は '[A-Z] {2} __ \ w +'のようなものでしょうか? –

+0

RemoveGuidLines()に与えられるパラメータは1行の文字列だけですか? – neuhaus

答えて

2

通常、私は配列からパターンを作成し、それと単一のRegexを作成します。あなたの場合、たとえば、Regex.Escape(toRemove)の代わりにtoRemoveを直接使用するバグがあります。だから、私は "DF__WisUser__Support__ | DF__NoteSetti__NoteT__ | DF__Note__IsHeadNote __...などのように見えるパターンを作成し、正規表現がより効率的です(例えば、最初の5文字列のいずれかでDF__を一度だけ読み込みます)。

コード:

private static string RemoveGuidLines(string s) 
{ 
    var pattern="^.*("+string.Join("|",GuidConstraintPartials.Select(p=>Regex.Escape(p)))+").*$"; 
    var regex = new Regex(pattern, RegexOptions.Multiline); 
    result = regex.Replace(s, "GUID line removed by report generator"); 
    return result; 
} 

また、それはあなたがRegexOptions.Compiledで、一度だけ正規表現を作成し、ちょうど配列として静的に格納できることは注目に値します。

0

削除する文字列に正規表現の特殊文字が使用されていない場合は、正規表現ではなくString.IndexOf()を使用すると便利です。

関連する問題