2016-12-07 2 views
1

Я получаю строку ответ от определенного компонента, который выглядит:Пользуется Regex лучше, чем строка разделена

"RX,993-756-V01 ver 02a ,4A7DF39B,124-412,0,0,0,1,8002,S, ,993-760-V01 ver 01b" 

и использовать простой строковый разделитель для разделения ответа на строку [] и перечислить для получения содержимого ,

char[] separator = { ',', '\r' }; 
string[] data = rxBuffer.Split(separator); //rxBuffer has the string response 

Теперь объект данных должен содержать:

data[0] = RX 
data[1] = 993-756-V01 ver 02a 
data[2] = 4A7DF39B.. so on 

Я хочу знать, если есть более эффективный способ, чем это (напр: с помощью Regex), где я могу запросить весь ответ и анализировать каждую запись на отдельные переменные.

i.e., data[1] into a variable called SWVersion property etc. 
+6

Regex никогда не более эффективен *, чем простой сплит. –

+1

Разрушение в C# пока недоступно. Однако вы можете получить словарь с результатами регулярного выражения. –

+0

@ WiktorStribiżew: Да, я знаю об этом, но хотел бы знать, действительно ли это действительно эффективно в таких случаях, как выше. –

ответ

1

Регулярные выражения - это тяжеловесное решение проблемы строкового анализа. Он основан на машине состояний, которая построена из необработанного выражения. Это становится несколько лучше, если вы можете скомпилировать регулярное выражение один раз, а затем использовать его несколько раз подряд, что зависит от проблемы, которую вы решаете.

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

С функциональной точки зрения, строка расщепление также лучше, потому что вы можете применить библиотеку LINQ к цепи всей обработки данных в одном операторе:

rxBuffer.Split(separator) 
    .Select(s => s.Trim()) 
    .Where(s => !s.IsNullOrEmpty()) 
    .GroupBy(s => s.Substring(0, 3)) 
    ... 

Это просто пример возможного анализа, который фильтрует пустой строки и группы остальных - первыми тремя буквами. Вы не получаете такую ​​простоту с регулярными выражениями, и не получаете скорость.

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