.net 有没有办法从字符串中删除“双引号?

oyjwcjzk  于 2023-06-25  发布在  .NET
关注(0)|答案(3)|浏览(145)

我在一个答案中找到的这段代码非常适合我希望从字符串中删除的字符。

var str = "My name @is ,Wan.;'; Wan";
var charsToRemove = new string[] { "[", "]" };
foreach (var c in charsToRemove)
{
    str = str.Replace(c, string.Empty);
}

有没有一种方法可以把字符串str中的双引号去掉?
谢谢
我尽力了

var str = "My name @is ,Wan.;'; Wan";
var charsToRemove = new string[] { "[", "]", """ };
foreach (var c in charsToRemove)
{
    str = str.Replace(c, string.Empty);
}

和/或

var str = "My name @is ,Wan.;'; Wan";
var charsToRemove = new string[] { "[", "]", """" };
foreach (var c in charsToRemove)
{
    str = str.Replace(c, string.Empty);
}

两个都不能编译。我也看了其他使用其他字符。方法,如IsLetterOrDigit,但我不确定是哪个方法-如果有的话可以找到“'s。

vx6bjr1n

vx6bjr1n1#

只需转义引号-\"即可。

var str = "My name @is ,Wan.;'; Wan";
var charsToRemove = new string[] { "[", "]", "\"" };
foreach (var c in charsToRemove)
{
    str = str.Replace(c, string.Empty);
}

另外,请确保您正确标记了您的问题,因为这是一个C#问题,而不是C:)

bweufnob

bweufnob2#

特殊字符需要用\转义,例如"\"",但似乎真实的的问题可能不同。
要避免为每个替换字符生成新字符串,可以使用正则表达式:

input=Regex.Replace(input,@"[\[\]""]","");

避免SQL注入

这些字符看起来很像表分隔符。再多的清理也无法修复将字符串连接到SQL中所导致的SQL注入。真实的上更简单的解决方案是使用参数化查询。

var str = "Robert'); DROP TABLE [students];--";
var sql="INSERT INTO MyHeaders (ID,Title) VALUES (@id,@title)";

using var con=new SqlConnection(connection_string);
using var cmd=new SqlCommand(sql,con);
cmd.Parameters.Add("@id",SqlDbType.Bigint).Value=123;
cmd.Parameters.Add("@text",SqlDbType.NVarChar,200).Value=str;

con.Open();
cmd.ExecuteNonQuery();

使用像Dapper这样的库,这可以简化为:

var str = "Robert'); DROP TABLE [students];--";
var sql="INSERT INTO MyHeaders (ID,Title) VALUES (@id,@title)";

using var con=new SqlConnection(connection_string);
con.Execute(sql,new {id=12345,title=str});

Dapper将根据名称将匿名类型属性与参数匹配,并根据需要打开/关闭连接

高效删除字符串

虽然问题的代码可以通过转义来修复,但它会生成大量临时字符串。C#和其他语言中的字符串是不可变的,因此任何修改操作都会创建一个新的字符串。这段代码将创建 3 个字符串,即使没有找到字符:

var charsToRemove = new string[] { "[", "]","\"", };
foreach (var c in charsToRemove)
{
    str = str.Replace(c, string.Empty);
}

这可以通过使用正则表达式一次替换所有字符来避免。只生成一个新字符串。

input=Regex.Replace(input,@"[\[\]""]","");

模式[\[\]"]匹配[]中的所有字符,并用空字符串替换它们。[]是模式中的特殊字符,因此它们也需要使用\进行转义。为了避免太多的反斜杠,使用了一个verbatim string,它将\视为普通字符。"再次需要转义,但这一次,所需要的是加倍,即""

omqzjyyz

omqzjyyz3#

将要替换的字符定义为charstring更有效。
此外,如果源字符串比要替换的字符数长-就像在示例代码中一样-更有效的方法是枚举源字符串字符并将它们与所有(在本例中为3个)替换字符进行比较,并使用字符串构建器逐个追加每个有效字符来构建新字符串。
如果你在你的应用程序中经常做这种替换的事情,你会意识到字符串分配在内存和速度方面的成本,因为为每个单个字符替换重新创建整个字符串是一个昂贵的操作。
如果你只是偶尔运行这些代码,当然也没关系。

var str = @"My ""name"" @is ,[Wan].;'; Wan";
    var result = new StringBuilder(str.Length);
    char [] charsToRemove = { '[', ']', '"' };
    foreach (var c in str)
    {
        if (!charsToRemove.Any(r => r == c))
        {
           result.Append(c);
        }
    }
    
    Console.WriteLine("OLD: {0}", str);
    Console.WriteLine("NEW: {0}", result);

相关问题