Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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#_String - Fatal编程技术网

C# 删除两个字符串之间的文本

C# 删除两个字符串之间的文本,c#,string,C#,String,我试着用C#编写一个函数,删除两个字符串之间的字符串。像这样: string RemoveBetween(string sourceString, string startTag, string endTag) 起初我以为这很容易,但过了一段时间,我遇到了越来越多的问题 所以这是一个简单的例子(所有带有startTag=“Start”和endTag=“End”的示例) 但它还应能够处理倍数,而无需删除以下文本: "Any Text Start remove this End between s

我试着用C#编写一个函数,删除两个字符串之间的字符串。像这样:

string RemoveBetween(string sourceString, string startTag, string endTag)
起初我以为这很容易,但过了一段时间,我遇到了越来越多的问题

所以这是一个简单的例子(所有带有startTag=“Start”和endTag=“End”的示例)

但它还应能够处理倍数,而无需删除以下文本:

"Any Text Start remove this End between should be still there Start and remove this End multiple" => "Any Text StartEnd between should be still there StartEnd multiple"
应始终使用最小的字符串删除:

"So Start followed by Start only remove this End other stuff" => "So Start followed by StartEnd other stuff"
它还应遵守标签的顺序:

"the End before Start. Start before End is correct" => "the End before Start. StartEnd is correct"
我尝试了一个不起作用的正则表达式(它不能处理倍数):


然后我尝试使用IndexOf和Substring,但我看不到结果。即使它能起作用,这也不是解决这个问题的最优雅的方法

下面是一种使用
string.Remove()的方法


我使用
LastIndexOf()
,因为可以有多个启动,您希望有最后一个启动。

或者您可以尝试使用LINQ

公共静态字符串删除(此字符串为s,IEnumerable字符)
{
返回新字符串(s.Where(c=>!chars.Contains(c)).ToArray());
}
您可以使用以下功能:

public static string Remove(string original, string firstTag, string secondTag)
{
   string pattern = firstTag + "(.*?)" + secondTag;
   Regex regex = new Regex(pattern, RegexOptions.RightToLeft);

   foreach(Match match in regex.Matches(original))
   {
      original = original.Replace(match.Groups[1].Value, string.Empty);
   }

   return original;
}

您必须稍微修改您的函数,以便与
RegexOptions进行非贪婪匹配。右至左
要处理所有示例:

    public static string RemoveBetween(string sourceString, string startTag, string endTag)
    {
        Regex regex = new Regex(string.Format("{0}(.*?){1}", Regex.Escape(startTag), Regex.Escape(endTag)), RegexOptions.RightToLeft);
        return regex.Replace(sourceString, startTag+endTag);
    }

但这仅在字符串中有一次“开始”和“结束”时有效。如果有多个(参见示例2),则它不起作用。构建循环也不是一件小事,因为“开始”和“结束”将保留在字符串中。对,使用空格和循环搜索
LastIndexOf(“开始”)
。这在前两个示例中效果很好,但在后一个示例中不起作用。你能解释一下代码到底是做什么的吗?是的,你说得对。此代码搜索原始字符串中的所有匹配项并将其删除,但在第3个示例中失败。让我看看我是否能修复它。@general4或它现在已修复:)我很抱歉在文本中说:“开始之前结束。结束之前开始是正确的”(我将把它添加到上面的示例中)您的代码发生了一些奇怪的事情。标记本身没有被删除。这是有目的的吗?这对前两个示例很有效,但对最后一个示例不起作用。添加
RegexOptions.RightToLeft
将处理最后一个示例(同时仍处理其他两个示例)。但我不确定它是否涵盖了所有想要的案例。(不适用于
,因此开始后跟着结束仅删除此结束其他内容“
,例如)使用
RegexOptions.Singleline
for
也匹配换行符。
string input = "So Start followed by Start only remove this End other stuff";
int start = input.LastIndexOf("Start") + "Start".Length;
int end = input.IndexOf("End", start);
string result = input.Remove(start, end - start);
public static string Remove(this string s, IEnumerable<char> chars)
{
    return new string(s.Where(c => !chars.Contains(c)).ToArray());
}
 string data = "text start this is my text end text";
            string startTag = "start";
            string endTag = "end";
            int startIndex = data.IndexOf(startTag)+ startTag.Length;
            Console.WriteLine(data.Substring(startIndex, data.IndexOf(endTag)-startIndex));
public static string Remove(string original, string firstTag, string secondTag)
{
   string pattern = firstTag + "(.*?)" + secondTag;
   Regex regex = new Regex(pattern, RegexOptions.RightToLeft);

   foreach(Match match in regex.Matches(original))
   {
      original = original.Replace(match.Groups[1].Value, string.Empty);
   }

   return original;
}
    public static string RemoveBetween(string sourceString, string startTag, string endTag)
    {
        Regex regex = new Regex(string.Format("{0}(.*?){1}", Regex.Escape(startTag), Regex.Escape(endTag)), RegexOptions.RightToLeft);
        return regex.Replace(sourceString, startTag+endTag);
    }