簡體   English   中英

正則表達式刪除C#中的轉義字符(特定字符)

[英]Regex to remove escape characters (specific ones) in C#

下面的正則表達式不是我真正需要的:

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;
}

您可以將這些字符放入字符類中,並替換為string.Empty

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

結果:

在此處輸入圖片說明

字符類通常執行得更快,就像其他列表一樣,存在很多回溯阻礙性能的問題。

如果我理解正確,那么您需要這樣的東西:

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

這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM