Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重写正则表达式循环?_C#_Regex - Fatal编程技术网

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;
}