用于删除 C# 中的转义字符(特定字符)的正则表达式
Regex to remove escape characters (specific ones) in C#
下面的正则表达式不是我真正需要的:
Regex.Replace(value.ToString(), "[^0-9a-zA-Z]+", "")
我需要从我的字符串中删除转义字符,因为我正在用字符串创建一个 SQL,当我有这个字符 '
或这个 \r\n
等时,我的 Sql 生成一个错误,我不能使用: SqlParameter 在这种情况下,因为我在字符串中只有一个 SQLs 列表,但我可以删除我不想要的字符。
所以,我只需要删除这些字符:
\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;
}
如果我没理解错的话,你想要这样的东西:
Regex.Replace(value.ToString(), "(\\n|\\r|'|\/\\)+", "")
见here。
你可以把这些字符放到一个字符class中,然后替换成string.Empty
:
var rgx4 = new Regex(@"[\r\n'/\]");
var tst = "\r \n ' /\";
tst = rgx4.Replace(tst, string.Empty);
结果:
字符class通常执行得更快,与备选列表一样,有很多回溯阻碍性能。
下面的正则表达式不是我真正需要的:
Regex.Replace(value.ToString(), "[^0-9a-zA-Z]+", "")
我需要从我的字符串中删除转义字符,因为我正在用字符串创建一个 SQL,当我有这个字符 '
或这个 \r\n
等时,我的 Sql 生成一个错误,我不能使用: SqlParameter 在这种情况下,因为我在字符串中只有一个 SQLs 列表,但我可以删除我不想要的字符。
所以,我只需要删除这些字符:
\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;
}
如果我没理解错的话,你想要这样的东西:
Regex.Replace(value.ToString(), "(\\n|\\r|'|\/\\)+", "")
见here。
你可以把这些字符放到一个字符class中,然后替换成string.Empty
:
var rgx4 = new Regex(@"[\r\n'/\]");
var tst = "\r \n ' /\";
tst = rgx4.Replace(tst, string.Empty);
结果:
字符class通常执行得更快,与备选列表一样,有很多回溯阻碍性能。