2015-05-12 21 views
2

Я работаю над созданием фида продуктов для сторонней компании. Данные, с которыми я работаю, имеют всевозможные недействительные, специальные символы, двойной интервал и т. Д. Они также запросили, чтобы данные кодировались в формате HTML, где используются специальные символы.Удаление специальных и недопустимых символов в строке

Примером некоторые данные, которые будут переданы = «Купить Кухня

Aid Artisan ™ Стенд Смеситель 4.8L»

 try 
     { 
      var removeDoubleSpace = Regex.Replace(stringInput, @"\s+", " "); 
      var encodedString = HttpUtility.HtmlEncode(removeDoubleSpace).Trim(); 
      var encodedAndLineBreaksRemoved = encodedString.Replace(Environment.NewLine, ""); 
      var finalStringOutput = Regex.Replace(encodedAndLineBreaksRemoved, @"(™)|(’)|(”)|(–)", ""); 

      return finalStringOutput; 
     } 
     catch (Exception) 
     { 
      return stringInput; 
     } 

Я пытался придумать один метод, который можно было бы назвать, сделать все выше, более чистым способом, а не несколькими выражениями Regex. Или, может быть, существует только одно регулярное выражение, которое охватывает все?

+0

Вы всегда могли бы написать функцию, которая перечисляет все символы в представленной строке, и проверка каждый символ для действительности (или пары действительности, т. е. проблема с пространством). Вы можете написать его, чтобы он перечислял их все только один раз, вместо выполнения нескольких регулярных выражений и замен. –

+1

Мои 2 цента: * Не беспокойтесь. * Если вам это удастся, вы, вероятно, закончите с длинным, сложным, трудночитаемым и в основном * страшным * регулярным выражением. Лучше сделать 2, 3, даже 10 заменить действия и сохранить читаемый код, если только вы не столкнулись с ужасными проблемами производительности. –

+0

Мой пример теперь более полный и разделяет все, что НЕ является символом ASCII, используя белый список. –

ответ

1

Используйте белый список, а не черный список, потому что вы можете более легко узнать, какие буквы приемлемы, какие письма могут быть неприемлемыми. Это белый список. Это список допустимых символов. Создайте свой белый список и удалите все, что отсутствует в этом списке. В вашем случае потенциальный белый список может включать все символы ASCII.

The following is a white list that captures все буквенно-цифровые и знаки препинания.

using System; 
using System.Text; 
using System.Text.RegularExpressions; 

public class Program 
{  
    private static string input = @"Buy Kitchen 

Aid Artisan™ Stand Mixer 4.8L "; 

    public static void Main() 
    { 
     var match = Regex 
      .Match(input, @"[a-zA-Z0-9\p{P}]+"); 

     StringBuilder builder = new StringBuilder(); 
     while(match.Success) 
     { 
      // add a space between matches 
      builder.Append(match + " "); 
      match = match.NextMatch(); 
     } 
     Console.WriteLine(builder.ToString()); 
    } 
} 

Выход

Buy Kitchen Aid Artisan Stand Mixer 4.8L 
+0

Единственная проблема, с которой я сталкиваюсь с этим подходом, - это мой белый список, который будет огромным, а также сохранен. В зависимости от некоторых символов, которые могут быть использованы в будущем. Спасибо, хотя –

+0

Белый список не должен быть огромным. Фактически, он будет более управляемым, чем ваш черный список.Вы никогда не знаете, когда появятся новые элементы черного списка, и это может привести к еще большему удивлению, чем к белым спискам. –

0

Вот немного расширенный код:

var removeDoubleSpace = Regex.Replace(stringInput, @"\s+", " "); 
var encodedString = System.Web.HttpUtility.HtmlEncode(removeDoubleSpace).Trim().Replace("™", string.Empty).Replace("’", string.Empty).Replace("”", string.Empty).Replace("–", string.Empty); 

Вам не нужно использовать var encodedAndLineBreaksRemoved = encodedString.Replace(Environment.NewLine, ""); поскольку символ новой строки символов уже удалены с \s+ регулярных выражений (\sспичек любой символ пробела, включая пробел, вкладку, форму-канал и т. д. Эквивалент [\ f \ n \ r \ t \ v].).

Кроме того, нет необходимости использования 2-ое регулярного выражения если вы не планируете, чтобы удалить определенный диапазон символов или класс (например, все символы внутри \p{S} сокращенного класса), таким образом, я просто прикован несколько string.Replace методов, правильно к обрезанной и закодированной строке.

Выход:

Buy Kitchen Aid Artisan Stand Mixer 4.8L 
0

Вам не нужно регулярное выражение, LINQ будет делать, а также:

var str = "Buy Kitchen Aid Artisan™ Stand Mixer 4.8L"; 
var newStr = new string(str.Where(c => !Char.IsSymbol(c)).ToArray()); 

Console.WriteLine(newStr); // Buy Kitchen Aid Artisan Stand Mixer 4.8L