【问题标题】:Regex to remove escape characters (specific ones) in C#正则表达式在 C# 中删除转义字符(特定字符)
【发布时间】:2015-04-28 06:07:41
【问题描述】:

下面的正则表达式并不是我真正需要的:

Regex.Replace(value.ToString(), "[^0-9a-zA-Z]+", "")

我需要从我的字符串中删除转义字符,因为我正在使用字符串创建一个 SQL,当我有这个字符 ' 或这个 \r\n 等时,我的 Sql 会生成一个错误,我不能使用:在这种情况下是 SqlParameter因为我只有一个字符串中的 SQL 列表,但我可以删除我不想要的字符。

所以,我只需要删除这些字符:

\r \n ' /\

按要求添加了我的代码:

private static string ConvertWhetherUsesComas(object value)
{
    // formats with comas or not
    if (value is String)
    {
        // fix problem with break characters such as \/`'
        value = String.Format("'{0}'", Regex.Replace(value.ToString(), "[^0-9a-zA-Z]+", ""));
    }
    else if (value is DateTime)
    {
        value = String.Format("'{0}'", value.SafeToDateTime(null).Value.ToString("yyyy-MM-dd hh:mm:ss tt"));
    }
    else if (value == null)
    {
        value = "NULL";
    }
    else if (value is Boolean)
    {
        value = value.SafeToBool(false) == false ? 0 : 1;
    }
    return value.ToString();
}
private static List<String> ConvertDiferencesToSql<T>(Differences<T> differences, string tableName, string primaryKey) where T : IHasId<int>
{
    var result = new List<String>();

    differences.New.ToList().ForEach(newItem =>
    {
        var fieldNames = new StringBuilder();
        var fieldValues = new StringBuilder();
        var properties = newItem.GetType().GetProperties().ToList();
        properties.ForEach(f =>
        {
            var propertyName = f.Name.ToUpper() == "ID" ? primaryKey : f.Name;
            var propertyValue = ConvertWhetherUsesComas(f.GetValue(newItem));

            if (propertyValue == "NULL") return; // ignores null values
            fieldNames.AppendFormat("{0},", propertyName);
            fieldValues.AppendFormat("{0},", propertyValue);
        });
        var sqlFields = fieldNames.ToString(0, fieldNames.Length - 1);
        var sqlValues = fieldValues.ToString(0, fieldValues.Length - 1);

        result.Add(String.Format("INSERT INTO {0} ({1}) VALUES ({2});", tableName, sqlFields, sqlValues));
    });

    differences.Changed.ForEach(changedRecord =>
    {
        var fields = new StringBuilder();

        changedRecord.ChangedFields.ForEach(changedField =>
        {
            var propertyName = changedField.Property == "ID" ? primaryKey : changedField.Property;
            var propertyValue = ConvertWhetherUsesComas(changedField.NewValue);

            fields.AppendFormat("{0}={1},", propertyName, propertyValue);
        });

        var sqlFields = fields.ToString(0, fields.Length - 1);

        result.Add(String.Format("UPDATE {0} SET {1} WHERE {2}={3};", tableName, sqlFields, primaryKey, changedRecord.Id)); 
    });

    differences.Deleted.ForEach(deletedItem => result.Add(String.Format("DELETE FROM {0} WHERE {1}={2};", tableName, primaryKey, deletedItem.GetId())));

    return result;
}

【问题讨论】:

  • Prepared statements 处理这种情况。能否请您也展示一下您的 sql 和 c# 部分?
  • 我的应用程序是一个从 MSAccess 到 SqlServer 的复制器软件,它非常复杂,以至于我创建了很多类,因此我构建了发送 List 以及所有 INSERTS 和 UPDATES 和 DELETES 的类,所以这就是为什么我不能使用我之前构建的 SqlParameters... Sql 很简单,例如“INSERT INTO 表(field1,...动态通过加载我的实体的属性)...
  • 但是我在帖子中添加了我的代码供您查看...@SonerGönül

标签: c# sql-server regex sqlcommand


【解决方案1】:

您可以将这些字符放入一个字符类中,并替换为string.Empty

var rgx4 = new Regex(@"[\r\n'/\\]");
var tst = "\r \n ' /\\";
tst = rgx4.Replace(tst, string.Empty);

结果:

字符类通常执行得更快,与替代列表一样,有很多回溯会阻碍性能。

【讨论】:

    【解决方案2】:

    如果我理解正确,你想要这样的东西:

    Regex.Replace(value.ToString(), "(\\\\n|\\\\r|'|\\/\\\\)+", "")
    

    here

    【讨论】:

    • 如何在这个正则表达式中添加这个字符? [^0-9a-zA-Z]+ 我想加入这个角色 -
    • 在我的或你的正则表达式中?在你的,它已经在。否定集不包括-。在我的:Regex.Replace(value.ToString(), "(\\\\n|\\\\r|'|\\/\\\\|-)+", "")
    • 是的,但是我改变了主意,最好只过滤字母数字加上字符 _ - 。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2017-12-07
    • 2013-12-28
    • 2011-07-03
    相关资源
    最近更新 更多