C# 如何重写正则表达式循环?
我有一个循环来删除字符串中的某些行C# 如何重写正则表达式循环?,c#,regex,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.Re
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__"
};
我的第六感告诉我,我可能可以使用更好的正则表达式或其他东西来解决这个问题,而不是使用这个丑陋的代码。有什么想法吗?通常我从数组创建模式,并用它创建一个正则表达式。例如,在您的情况下,直接使用
toRemove
而不是Regex.Escape(toRemove)
可能是一个bug。因此,我将创建一个类似于“DF_uuuWisuser_uuuSupport_uuu124;DF_uuuuNoteSetti_uuuuuuuuNotet_124;DF_uuuNote_uuuuuuu…等等”的模式,并将其用作正则表达式,效率也会更高(例如,前5个字符串中的任何一个只读取DF_uuuuu)
代码:
另外,值得注意的是,使用RegexOptions.Compiled只能创建一次正则表达式,并将其静态存储为数组。通常我从数组创建模式,并使用它创建单个正则表达式。例如,在您的情况下,直接使用
toRemove
而不是Regex.Escape(toRemove)
可能是一个bug。因此,我将创建一个类似于“DF_uuuWisuser_uuuSupport_uuu124;DF_uuuuNoteSetti_uuuuuuuuNotet_124;DF_uuuNote_uuuuuuu…等等”的模式,并将其用作正则表达式,效率也会更高(例如,前5个字符串中的任何一个只读取DF_uuuuu)
代码:
另外,值得注意的是,使用RegexOptions.Compiled只能创建一次正则表达式,并将其静态存储为数组。如果要删除的字符串未使用任何正则表达式特殊字符,则可能需要使用
String.IndexOf()
而不是正则表达式。如果要删除的字符串没有使用任何正则表达式特殊字符,您可能希望使用String.IndexOf()
而不是正则表达式。您可以有多少GuidConstraintPartials
,任何以DF__u
开头的东西都将成为要替换的GUID吗?您的正则表达式是否类似于[A-Z]{2}\uuuw+
?给定给RemoveGuidLines()的参数是否只是一个单行字符串?@AlexK。我不确定。我需要替换包含部分字符串的行。@WiktorStribiżew One string集合中的项可能不多于列出的项。也许有一天会添加一两个。您可以有多少个GuidConstraintPartials
呢?另外,任何以DF__;
开头的东西都会成为要替换的GUID吗?您的正则表达式是否类似于[A-Z]{2}\uuuw+
?给定给RemoveGuidLines()的参数是否只是一个单行字符串?@AlexK。我不确定。我需要替换包含部分字符串的行。@WiktorStribiżew One string集合中的项可能不多于列出的项。也许有一天会增加一两个。
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;
}