我有一个循环来删除字符串中的某些行。
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__"
};
我的第六感告诉我,我可以使用更好的正则表达式或其他东西来解决这个问题,而不是这个拙劣的代码。有什么想法吗?
答案 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()
而不是正则表达式。