![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Noobs |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 13.12.2008 Репутация: нет Всего: нет |
Всем привет, возникла сложность в составлении регулярного выражения, собственно сам текст, 3 строки:
Требуется получить в одну переменную всё то что до знака =, в данном случае это Y и PH ну и соответственно ws_v_2_243232_[slot_id] , а в другую переменную всё что после этого знака. Сложность в том что в начале текста в фрагменте который нужно определить в первую переменную могут быть почти все символы и спец символы, а во второй переменной такие же знаки =, я пробовал делать так:
Но он срабатывает правильно только тогда когда в фрагменте который нужно поместить во вторую переменную нет знака =, т.е в тексте который представлен выше найдется верно только
так вот, как можно красиво составить регулярное выражения для данного случая? а так же есть ли в регулярных выражениях условия? что то вроде (?<name>.* NOT =). Конечно грубовато, но для примера пойдёт |
||||||
|
|||||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Noobs, от начала строки, как можно меньше любых символов, =, и все до конца строки. юзать с опцией multiline.
ЗЫ. регулярные выражения - зло. Это сообщение отредактировал(а) PashaPash - 15.1.2009, 20:53 |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: нет Всего: 44 |
Noobs, не знаю правил составления регекспов на С#, но на перле выглядело бы так
PashaPash, то-то это зло засунули в Java, C#, Python, PHP, Perl(про него и говорить нечего, это его сила), ....... Регулярные выражения - сила, просто ее надо с умом применять! Это сообщение отредактировал(а) chaos - 15.1.2009, 23:10 |
|||
|
||||
| Noobs |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 13.12.2008 Репутация: нет Всего: нет |
Всё получилось
Это сообщение отредактировал(а) Noobs - 16.1.2009, 03:21 |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Раз уж меня минусуют эа это утверждение - могу пояснить. 1. Они реализованы везде по разному, совпадают только базовые конструкции. 2. Хоть сколько-нибудь сложный regexp - совершенно не поддерживаемая вещь. Аналогичный код на C# - поиск первого =, отрезание строчки до и после - намного читабельнее регеэкспа. И работает быстрее. И шанс, что через пол года нуб, накнувшись на код, сходу поймет что происходит - намного выше. Я не призываю email валидировать вручную. Но решать задачу топикастера регекспами - это просто показать "и я знаю регулярные выражения". И обчеспечить в будущем нубу потерю рабочего дня, на хотя бы основ регекспов, т.е. написал регесп там, где не надо было == ограбил контору на 40-50$. 3. Даже простые задачи на регэкспах можно написать совершенно по разному. Вот chaos зачем-то понтанулся и впихнул [^=]. А я понтанулся, и впихнул нежадную выборку. У него почему-то +, хотя у топикастера - *. Это уже потенциально 2 бага - при пустом ключе и значении, и всего-то в 10 символах. З.Ы. вот и помогай после этого людям |
|||
|
||||
| Bishop |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 3.6.2005 Где: Минск, Беларусь Репутация: 6 Всего: 16 |
PashaPash, раз уж я минусую, прокомментирую.
"регулярные выражения - зло" — это была неконструктивная, неаргументированная, не относящаяеся к теме, провоцирующая флейм и "разжигающая" холивор, реплика. Что и имеем 1. Сложно спорить. Различия настолько единичны и редки, что заострять на них внимание несерьёзно. 3. [^=]= и .*?= совсем разные вещи, и первая в теории производительнее в разы (на практике, благодаря оптимизации они будут работать одинаково). + и * — регулярные выражения позволяют совместить проверку валидности строки с её разбором, причем максимально лаконично. 2. Ваши представления о читаемости тоже, по меньшей мере странные. Предлагается сравнить:
Первый и третий вариант были написаны с ходу, второй отнял минут десять. Неужели второй легче прочитать? Отказываюсь понимать.
Предлагаете оберегать новичков от любых сложностей? За рабочий день можно изучить регекспы в совершенстве. А нанимая молодого неопытного сотрудника, работодатель обычно понимает, что придётся тратить время и средства на его обучение. Предлагаете писать такой код, чтобы в любой момент работодатель мог заменить весь штат профессионалов на студентов второго курса? Тоже вариант. Опять же сложно спорить. Но это не единственно-верный путь и не надо его так пропагандировать. Если вы недостаточно знакомы с какой-то технологией или она вам по каким-то причинам очень не нравится, есть мнение, что не стоит пытаться очернить её в глазах окружающих. |
||||
|
|||||
| PashaPash |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Пока холиваришь только ты.
А я и не заостряю. Я просто очень непрозрачно намкнул что надо сначала научится использовать регулярные выражения, а потом уже "внедрять".
Почему именно второй? Я имел в виду что-то вроде первый vs третий, ну или
на случай если входной текст большой, и или читаетсяиз потока. По читабельности лучше регулярных выражений, IMHO. Можно даже Split убрать, оставить IndexOf. И работает быстрее, и память не кушает, если читать из файла.... Все крупные фирмы садят новичков-студентов прежде всего на поддержку старых проектов, никто не дает с нуля писать. И никто не говорит им - можете 3 месяца ничего не делать, учится, а мы будем вам платить зарплату. И да, код надо писать так, чтобы студент 3-го курса смог его прочитать и исправить, не тупля по дню над 4 строчками.
Добавлено через 11 минут и 53 секунды ЗЫ - и зачем у тебя в 3-м варианте split? Почему не Matches(..., RegexOptions.Multiline)? Намного читабельнее получилось бы. ;) Это сообщение отредактировал(а) PashaPash - 17.1.2009, 16:42 |
||||||||
|
|||||||||
| Bishop |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 3.6.2005 Где: Минск, Беларусь Репутация: 6 Всего: 16 |
PashaPash,
Конечно:
Но этот код не равнозначен, потому как опускает неподошедшие строки. Ваш же код выдаст ошибку, если в строке нет "=". С IndexOf нужно проверять неотрицательность результата. А как быть если "=" первая или последняя в строке. В случае регекспов это решается простой правкой шаблона, в остальных — рядом дополнительных проверок. |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
А никто не знает на что именно надо проверять, и надо ли проверять вообще. Опускать неподошедшие строки, или выдавать подробные ошибки. В случае не-регеспов гораздо проще узнать что именно неверно в строке. В случае регеспов - !m.Success - и все, гадай что там неправильно. Вообще достаточно посмотреть на этот топик - если регеспы тах хороши, то почему топикастеру понадобилось аж 7 часов чтобы решить мегазадачу? При том, что в начале этих 7 часов он уже знал про регэспы, и даже про grouping constructs. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |