C# 从输入的起点和终点删除一组字符串(数组)的多次出现
背景:用户经常通过所见即所得编辑器在输入的末尾(有时是开头)添加额外的换行符,这些换行符在BR、p和DIV标记之间可能有所不同。我需要做一个清理,从输入的开始和结束删除任何类型的换行符 以下是需要清理的输入示例:C# 从输入的起点和终点删除一组字符串(数组)的多次出现,c#,html,string,while-loop,substring,C#,Html,String,While Loop,Substring,背景:用户经常通过所见即所得编辑器在输入的末尾(有时是开头)添加额外的换行符,这些换行符在BR、p和DIV标记之间可能有所不同。我需要做一个清理,从输入的开始和结束删除任何类型的换行符 以下是需要清理的输入示例: 这是要保留的输入 为了清理,我创建了以下扩展,它运行良好。。。除此之外,它按顺序循环通过每个换行符 公共静态字符串RemoveStartAndEndBreaks(此字符串输入) { var lineBreaks=new[]{“”、“”、“”、“”、“”、“”、“”、”、“、”、“};
这是要保留的输入
为了清理,我创建了以下扩展,它运行良好。。。除此之外,它按顺序循环通过每个换行符
公共静态字符串RemoveStartAndEndBreaks(此字符串输入)
{
var lineBreaks=new[]{“
”、“
”、“
”、“”、“”、“”、“”、”、“、”、“};
foreach(换行符中的变量lb)
{
while(input.StartsWith(lb))
{
输入=输入子串(磅长);
}
while(input.EndsWith(lb))
{
输入=输入子字符串(0,输入长度-磅长度);
}
}
返回输入;
}
所以问题是,它只会清除所有换行符,如果它们在数组中的显示顺序相同。因此,使用上述示例,结果输出为:
这是要保留的输入
请注意,如果它出现在输入字符串的开头或结尾,它只会删除它找到的第一个中断类型,而忽略其余的中断类型
问题1。当找到匹配项时,如何通过数组重新启动循环
问题2。是否在每次找到匹配项时重新启动循环是唯一的选择,还是有更有效的方法来检查每次出现的情况并从开始和结束处将其删除
第三季度。我是否错过了一些显而易见的东西
请注意,输入是html,因此结果输出将(可能)包含字符串数组中描述的相同换行符,这些换行符必须保留
i、 e.我只是从输入的开始和结束处删除换行符。中间的那些需要留在那里。 这里有一个例子,这将使用数组通过循环而不是其他方式检查每个输入。
public static string RemoveStartAndEndBreaks(this string input)
{
var lineBreaks = new[] { "<br>", "<br/>", "<br />", "<p></p>", "<p> </p>", "<p> </p>", "<div></div>", "<div> </div>", "<div> </div>" };
for (int i = 0; i < lineBreaks.Length; i++)
{
if (input == lineBreaks[i])
{
//Do This
}
}
return input;
}
公共静态字符串RemoveStartAndEndBreaks(此字符串输入)
{
var lineBreaks=new[]{“
”、“
”、“
”、“”、“”、“”、“”、”、“、”、“};
对于(int i=0;i
看起来最容易阅读的方法是标记匹配项并使用goto重新启动循环:
公共静态字符串RemoveStartAndEndBreaks(此字符串输入)
{
var lineBreaks=new[]{“
”、“
”、“
”、“”、“”、“”、“”、”、“、”、“};
var匹配=假;
开始:
foreach(换行符中的变量lb)
{
匹配=假;
while(input.StartsWith(lb))
{
输入=输入子串(磅长);
匹配=真;
}
while(input.EndsWith(lb))
{
输入=输入子字符串(0,输入长度-磅长度);
匹配=真;
}
如果(匹配)转到开始;
}
返回输入;
}
可能不是最有效的,但它确实有效
更新:所以,使用标签和goto是一种不好的做法,因为它太原始,可能会很混乱。我认为,作为一个结果,这个答案被否决了两次。然而,答案是有效的,而没有其他人提供有效的解决方案。你们中的大多数人都比我聪明得多——我知道这一点
@Nhan Phan提供了一个更智能、更有效的解决方案。做得好。您可以使用一个标志来确保输入的开始/结束有中断行,并循环直到标志为false:
public static string RemoveStartAndEndBreaks(string input)
{
var lineBreaks = new[] { "<br>", "<br/>", "<br />", "<p></p>", "<p> </p>", "<p> </p>", "<div></div>", "<div> </div>", "<div> </div>" };
var isMatched = true;
while (isMatched)
{
foreach (var lb in lineBreaks)
{
if (input.StartsWith(lb))
{
input = input.Substring(lb.Length);
isMatched = true;
break;
}
if (input.EndsWith(lb))
{
input = input.Substring(0, input.Length - lb.Length);
isMatched = true;
break;
}
isMatched = false;
}
}
return input;
}
公共静态字符串RemoveStartAndEndBreaks(字符串输入)
{
var lineBreaks=new[]{“
”、“
”、“
”、“”、“”、“”、“”、”、“、”、“};
var isMatched=真;
while(已匹配)
{
foreach(换行符中的变量lb)
{
if(输入。启动带(磅))
{
输入=输入子串(磅长);
isMatched=true;
打破
}
if(输入端开关(磅))
{
输入=输入子字符串(0,输入长度-磅长度);
isMatched=true;
打破
}
isMatched=假;
}
}
返回输入;
}
尊敬 哦,天哪,不要用标签。你想得太多了,为什么不呢?过度思考?变量
lb
?lb=换行符我假设您的输入在其他地方,无论是“干净”还是“不干净”,都可以输入。谢谢@xTwisteDx提供的提示。你让我想得更进一步了。我不知道@xTwisteDx如何工作。输入永远不会等于换行符。这显示了逻辑。我不熟悉HTML,所以我能做的就是显示逻辑。使用数组测试匹配项,然后检查整个数组并更改是否存在匹配项。您可以添加一个输出应为的示例吗?我对html不是很熟悉,但通过这个例子,我应该能够为您提供一个工作方法。您是否尝试过使用input.replace(“”,”)它没有那么简单。我需要删除所有换行符,这些换行符可以以多种不同的格式出现(如字符串数组中所列)。我认为,在foreach循环中,可以同时删除while循环。并且,用输入替换它们。替换(lb,“”;第一个参数是您的目标,而空引号是您要用其替换目标的参数。在这种情况下没什么。听起来是个好主意,但是