如何重写我的Regex循环?

时间:2016-04-05 11:26:26

标签: c# regex

我有一个循环来删除字符串中的某些行。

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

    foreach (var toRemove in GuidConstraintPartials)
    {
        var regex = new Regex($@"^.*{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__"
    };

我的第六感告诉我,我可以使用更好的正则表达式或其他东西来解决这个问题,而不是这个拙劣的代码。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

通常我从数组创建模式并使用它创建一个正则表达式。例如,在您的情况下,直接使用toRemove代替Regex.Escape(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创建一次正则表达式,并将其静态存储,就像数组一样。

答案 1 :(得分:0)

如果要删除的字符串未使用任何正则表达式特殊字符,则可能需要使用String.IndexOf()而不是正则表达式。