C# 字符串。替换更多出现的后续字符
最近,我使用了String.Replace方法来确保用户输入(后来包含在HTML注释中)被正确地清理。我需要这个输入供以后使用,所以HttpUtility.HtmlEncode不是一个选择 我的代码所做的是对输入调用String.Replace(“-”,“-”)。然而,我意识到Replace函数的行为并不像我预期的那样。例如:C# 字符串。替换更多出现的后续字符,c#,.net,string,C#,.net,String,最近,我使用了String.Replace方法来确保用户输入(后来包含在HTML注释中)被正确地清理。我需要这个输入供以后使用,所以HttpUtility.HtmlEncode不是一个选择 我的代码所做的是对输入调用String.Replace(“-”,“-”)。然而,我意识到Replace函数的行为并不像我预期的那样。例如: var userData = "----"; return userData.Replace("--", "- -"); // returns "- -- -", I e
var userData = "----";
return userData.Replace("--", "- -"); // returns "- -- -", I expected "- - - -"
或:
在第二个示例中,您可以看到,这种清理是无用的,恶意用户实际上仍然可以结束注释
现在我的问题是:
注意:我知道还有其他方法来清理输出(例如,用下划线替换连字符),但我对这种特殊的方法感兴趣(即:空格-后续破折号)。这是预期的行为,因为对
Replace
的调用只对字符串进行了一次传递。因此,字符串中的每个“-”实例都被“--”替换,每个实例都彼此邻接,例如“--”旁边的“--”旁边的“--”旁边的“--”等等,看起来是这样的:“--|-|-”(这是预期的行为,因为对Replace
的调用只在字符串上传递一次。因此,“-”的每个实例在您的字符串中,字符串被替换为“--”,每个字符串彼此邻接,例如“--”旁边“--”旁边“--”旁边“--”等等,看起来是这样的:“----”(string.Replace
是否有一个字符串通过。要实现您的期望,请执行以下操作
while(userData.Contains("--"))
{
userData = userData.Replace("--", "- -");
}
string.Replace
是否通过字符串。若要达到您的期望,请执行以下操作
while(userData.Contains("--"))
{
userData = userData.Replace("--", "- -");
}
您是否考虑过使用
RegEx
?有一种RegEx.Replace()
方法,您可以使用适当的RegEx
模式处理不同的变化和出现的情况
此正则表达式将全局查找破折号,并将其替换为和blank+破折号。。。
但就像我说的,你只需要找到正确的模式。。。
HTH您是否考虑过使用
RegEx
?有一种RegEx.Replace()
方法,您可以使用适当的RegEx
模式处理不同的变化和事件
此正则表达式将全局查找破折号,并将其替换为和blank+破折号。。。
但就像我说的,你只需要找到正确的模式。。。
嗯
public static class StringExtensions
{
public static string ReplaceAllOccurrences(
this string str,
string oldValue,
string newValue)
{
var result = str;
while (result.Contains(oldValue))
{
result = result.Replace(oldValue, newValue);
}
return result;
}
}
[TestClass]
public class ReplaceAllOccurencesTest
{
[TestMethod]
public void Test()
{
var userData = "----";
var replaced = userData.ReplaceAllOccurrences("--", "- -"); // returns "- -- -", I expected "- - - -"
Assert.AreEqual(replaced, "- - - -");
userData = "---";
replaced = userData.ReplaceAllOccurrences("--", "- -"); // returns "- --", I expected "- - -"
Assert.AreEqual(replaced, "- - -");
}
}
public static class StringExtensions
{
public static string ReplaceAllOccurrences(
this string str,
string oldValue,
string newValue)
{
var result = str;
while (result.Contains(oldValue))
{
result = result.Replace(oldValue, newValue);
}
return result;
}
}
[TestClass]
public class ReplaceAllOccurencesTest
{
[TestMethod]
public void Test()
{
var userData = "----";
var replaced = userData.ReplaceAllOccurrences("--", "- -"); // returns "- -- -", I expected "- - - -"
Assert.AreEqual(replaced, "- - - -");
userData = "---";
replaced = userData.ReplaceAllOccurrences("--", "- -"); // returns "- --", I expected "- - -"
Assert.AreEqual(replaced, "- - -");
}
}
也许这是有用的:
var userData = "----";
userData = Regex.Replace(userData, @"-{1}", " -").TrimStart();
也许这是有用的:
var userData = "----";
userData = Regex.Replace(userData, @"-{1}", " -").TrimStart();
是的,这是
Replace
的预期行为,因为它与第一个-
匹配。看起来像Replace
IMO的完全合理行为。如果它做了任何其他事情,我会感到惊讶。您是否知道转义函数会产生不明确的结果?如果您转义-
,您会得到-
,将其从ould get--
..@SonerGönül--返回一个新字符串,其中当前实例中指定字符串的所有匹配项都替换为另一个指定字符串…坦率地说,我可能仍然会对其进行HtmlEncode。注释并不是真正用来查看或用作数据的,因此如果您计划从命令中读取确切的值ent,你做错了。就此而言,我不知道你为什么首先允许用户指定的动态注释。是的,这是Replace
的预期行为,因为它与first--
匹配。看起来Replace
IMO的行为完全合理。如果它做了其他任何事情,我会感到惊讶。是吗你知道转义函数会产生不明确的结果吗?如果你转义-
,你会得到-
,取消它将得到-
。@SonerGönül--返回一个新字符串,其中当前实例中所有出现的指定字符串都会被另一个指定字符串替换…坦白地说,我可能仍然会返回tmlEncode.Comments并不是真的要被视为或用作数据,所以如果你打算从注释中读取确切的值,你就做错了。就此而言,我不知道你为什么要首先允许用户指定的动态注释。Replace
返回新字符串。它不会(不能)更改原始字符串,因为它是不可变的。Replace
返回新字符串。它不(不能)更改原始字符串,因为它是不可变的。-返回一个新字符串,其中当前实例中指定字符串的所有匹配项都替换为另一个指定字符串。@bayo15是的,您是对的。我更正了它,非常感谢。-返回一个新字符串,其中当前实例中指定字符串的所有匹配项都是r“替换为另一个指定的字符串。@bayo15是的,你是对的。我更正了它,非常感谢你。谢谢你的回答。但是,这并不能真正解决问题,因为用户只需使用7个连字符来结束注释。但我明白你的意思。@bayo15--你需要澄清一下。这回答了你当前编写的问题。”嗯,如果有一些条件(正如你刚才提到的)关于字符串末尾的不同行为,那么你应该在原始问题中提供。但是,你现在不能修改你的问题,因为人们已经按照当前编写的方式回答了问题,如果你对其进行实质性修改,将使现有的答案失去意义。这样做是违反规则的。我认为将此描述为一个问题
var userData = "----";
userData = Regex.Replace(userData, @"-{1}", " -").TrimStart();