Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2013, 06:40   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Счастье Использование регулярных выражений

В настоящий момент разбираюсь с темой регулярных выражений в целом и в C# в частности - крайне интересная и удобная штука, вот только была бы немного по-проще, чтобы можно было освоить все за раз.
Необходимость использования регулярных выражений можно определить следующим образом: нам необходимо общаться с сервером, получая от него некоторые строковые ответы, из этих строковых ответов мы должны извлекать определенные переменные и смотреть как прошел наш запрос. Например, на запрос моей программы сервер должен ответить:
Цитата:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<id>currentID</id>
<uniqueData>uniq</uniqueData>
<sum>sum</sum>
<result>anyResult</result>
</response>
, где currentID - текущий уникальный идентификатор, операции, которую запросил; uniq - уникальный путь, куда сохранена информация; sum - сумма; anyResult - результат операции. Да, можно все делать ручками, т.е. гора Substring, Remove + проверка на валидность (в подстроке содержится именно число, а не какой-то бред) и т.д., а можно сделать несколько проще с помощью регулярного выражения:
Код:
//паттерн, который используем для поиска
		protected const String MyPattern="encoding=\"(?<encoding_val>[^,]*)\"\\?><response><id>(?<id_val>[0-9]*)</id><uniqueData>(?<uniqueData_val>[^,]*)</uniqueData><sum>(?<sum_val>[0-9]*)</sum><result>(?<result_val>[^,]*)</result></response>";

		public static void Sample()
		{	
//то, что получили. Разумеется, в реальном приложении эта строка должна передаваться в качестве параметра
			String myStr="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<response>\n<id>1234567</id>\n<uniqueData>data</uniqueData>\n<sum>123</sum>\n<result>Ok</result>\n</response>";

			Console.WriteLine(myStr);
			//удаляем переходы на новые строки в myStr
			myStr=myStr.Replace("\n", String.Empty);
//создаем регулярное выражение
			Regex myRegex=new Regex(MainClass.MyPattern);

		//применяем регулярное выражение	
			Match myMatch=myRegex.Match(myStr);
			
			
			
			String encoding_val, id_val, uniqueData_val, sum_val, result_val;
			//получаем необходимые нам значения переменных
			encoding_val=myMatch.Groups["encoding_val"].Value;
			id_val=myMatch.Groups["id_val"].Value;
			uniqueData_val=myMatch.Groups["uniqueData_val"].Value;
			sum_val=myMatch.Groups["sum_val"].Value;
			result_val=myMatch.Groups["result_val"].Value;

			
			Console.WriteLine("1='{0}\n2='{1}'\n3='{2}'\n4='{3}'\n5='{4}'", encoding_val, id_val, uniqueData_val, sum_val, result_val);
			
		}
Согласитесь, что проще? Разумеется, в реальном приложении перед применением метода Match и заполнением необходимых переменных необходимо выполнить метод IsMatch, который проверит строку на валидность для текущего паттерна, иначе при попытке использовать строки кода:
Код:
encoding_val=myMatch.Groups["encoding_val"].Value;
для "неправильной" строки мы получим исключение. Теперь давайте представим, сколько Split'ов, Substring, IndexOf и т.д. мне пришлось использовать, если бы я отказался от регулярки. Однако, разумеется, предел в использовании регулярных выражений также должен быть!
Теперь вопрос к Вам: как часто Вам приходится использовать регулярные выражения и как Вы к ним относитесь?
Вот линк на неплохое описание регулярных выражений, правда для Java (принципы регулярных выражений везде одинаковы). Относительно же C#, можно посмотреть MSDN. Некоторые неплохие статьи по регулярным выражениям:
  1. Прекратите проверять Email с помощью регулярных выражений!
  2. Истинное могущество регулярных выражений
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 03.05.2013, 07:31   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Не ну, применять регулярки к XML это даже как-то не серьёзно, честно
Цитата:
Теперь вопрос к Вам: как часто Вам приходится использовать регулярные выражения и как Вы к ним относитесь?
Использую по мере необходимости.

Например для выделения обозначения времени из строки:
1w5d15h6m53ms000:00:00

Мне нужно 1w5d15h6m53ms размер этого значения не известен заранее, к последнему тоже не придраться. Да и разбить его надо на части и проверить корректность ввода, а ещё привести к человеко-понятному формату типа "1 неделя 5 дней 15 часов 6 минут и 32 секунды" Регулярка:
[\d{?}]+[w,d,h,m,s]

со второй частью строки так же поступаю.

Далее ситуация когда есть массив данных и надо вырвать оттуда однотипные данные, ярким примером будет html-таблица с кучей данных.
Человек_Борща вне форума Ответить с цитированием
Старый 03.05.2013, 11:49   #3
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Человек_Борща
Цитата:
Не ну, применять регулярки к XML это даже как-то не серьёзно, честно
А если это невалидный xml. ? тоесть сначала сгенерился xml, потом в него что то вписали, и парсеры его не разбирают.

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

Так вот, оригинальные данные из этого поля доставались регулярками.

Имхо, если всё делать по уму, подобные надобности в регулярках сильно снизятся.
the_deer_one вне форума Ответить с цитированием
Старый 03.05.2013, 12:12   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
тоесть сначала сгенерился xml, потом в него что то вписали, и парсеры его не разбирают.
Пойти в впихнуть руки в плечи, тем кто вписывает не туда куда надо.

Цитата:
новую колонку почему то добавлять не стали, (это же надо кучу процедур менять, таблицы и т.д.)
Тоже самое, но этим ещё и головы.

Это недоработки программистов а не парсеров XML.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правильность регулярных выражений ! pompiduskus PHP 0 01.02.2012 19:42
Сборка библиотеки boost регулярных выражений для С + +. Anubys Общие вопросы C/C++ 10 25.10.2011 00:35
Использование регулярных выражений для извлечения части строки Meta2 Microsoft Office Excel 4 04.09.2011 18:18
Вопрос по использованию регулярных выражений А здесь смотрели? alexplato Общие вопросы .NET 2 14.12.2010 20:33