2015-04-28 4 views
2

Регулярное выражение ниже не то, что я точно нужно:Regex для удаления управляющих символов (специфические) в 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; 
} 
+2

[Подготовленные утверждения] (http://en.wikipedia.org/wiki/Prepared_statement) обрабатывает эти случаи. Можете ли вы показать свою часть sql и C#? –

+0

Мое приложение является программным обеспечением для репликатора от MSAccess до SqlServer. Это настолько сложное, что я создал так много классов, которые я структурировал, чтобы отправить List со всеми ВСТАВКАМИ, ОБНОВЛЕНИЯМИ и УДАЛИТЬЮ, поэтому я не могу использовать SqlParameters I сначала создайте его ... Sql просты, как «INSERT INTO table (field1, ... dynamic, загружая свойства моей сущности) ... –

+0

Но я добавил свои коды в сообщение, чтобы вы его увидели ... @ SonerGönül –

ответ

4

Вы можете поместить эти символы в классе символов, и заменить string.Empty:

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

Результат:

enter image description here

Класс символов обычно выполняется быстрее, так как с альтернативным списком, есть это много препятствий, препятствующих обратному отслеживанию.

1

Если я правильно понял, вы хотите что-то вроде этого:

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

См. here.

+0

Как добавить этот символ - в это регулярное выражение? [^ 0-9a-zA-Z] + Я хочу включить этот символ - –

+1

В моем или yugu регулярном выражении? В вашем, он уже в. не указывать '-'. В моем: ' Regex.Replace (значение.ToString(), "(\\\\ n | \\\\ r | '| \\/\\\\ | -) +" , "") ' – Docteur

+0

Да, но я изменил свою идею, лучше всего фильтровать только Alphanu meric плюс символы _ -. –

 Смежные вопросы

  • Нет связанных вопросов^_^