Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Регулярные выражения  (Прочитано 23019 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 03-07-2007 11:24 » 

Есть строка типа
some of text|~|some text|~||~|other text|~||~|//~//more text//~//|~| и т.д.
Пытаюсь сообразить шаблон, который бы мне возвращал только текст между |~| |~| или между |~|//~// //~//|~| при этом сами разделители мне не нужны
Вот вокруг чего я сейчас танцую
Код:
((?:|~|(//~//)?)(.*)(?:(//~//)?|~|))+?
Возвращается строка целиком
Где моя ошибка?
На всякий случай тестовый код
Код:
MatchCollection an = Regex.Matches(/*"|~|//~//ert//~//|~||~|erttt|~|"*/"some of text|~|some text|~||~|other text|~||~|//~//more text//~//|~|", "((?:|~|(//~//)?)(.*)(?:(//~//)?|~|))+?", RegexOptions.ExplicitCapture);
Match a = an[0];
GroupCollection gr = a.Groups;
Group g = gr[2];
« Последнее редактирование: 03-07-2007 11:27 от nikedeforest » Записан

ещё один вопрос ...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 03-07-2007 19:17 » 

nikedeforest, попробуй первый блок тоже "?:" сделать
Кстати, а поддерживают ли эти регулярные выражения "заглядывание", как в perl? Блоки типа (?= ) и (?<= )
« Последнее редактирование: 03-07-2007 19:20 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 04-07-2007 05:15 » 

Сейчас попробую.
"заглядывания" поддерживают
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 04-07-2007 05:56 » 

имелось ввиду
Код:
(?:(?:|~|(//~//)?)(.*)(?:(//~//)?|~|))+?
Не понял
Эффект тот же
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 04-07-2007 08:07 » 

Вот еще пример
строка
Код:
some of text|~|some text|~||~|other text|~||~|//~//more text//~//|~|cbcvbcvbcb some ert some

шаблон
Код:
(?<=some).+(?=some)

результат
Код:
of text|~|some text|~||~|other text|~||~|//~//more text//~//|~|cbcvbcvbcb some ert

А хочу, чтоб было
Код:
1)of text|~
2) ert
Пробовал ((?<=some).+(?=some))?? - результат пустая строка
 ((?<=some).+(?=some))+? - результат тот же, что в шаблоне, который я привел самым первым
« Последнее редактирование: 04-07-2007 08:19 от nikedeforest » Записан

ещё один вопрос ...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 04-07-2007 10:00 » 

Я думаю, тебе не match надо, а split - так проще будет.

Попробуй этим резать:

(?://~//)?\|~\|(?://~//)?

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 04-07-2007 12:06 » 

мне как бы не разбить же надо. Требуется получить то, что обрамлено определенными символами. А это, сам понимаешь не совсем тоже самое. Но походу дела, придется этим воспользоваться, потому какт я уже не знаю что придумать, чтобы MAtch не склеивал результат.
Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 04-07-2007 12:21 » 

Никита, а нельзя вставлять какой то определенный символ также? Например "|". А потом можно сделать split строки.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 04-07-2007 12:43 » 

Виктор, сплитом можно сделать. Варианты как сделать иначе есть, RXL предложил неплохой вариант, просто регулярными выражениями было бы правильнее и надежнее и не казалось мне тогда, что я так и не смогу победить эту проблему. Удивительно, складывается впечатление, что я первый, кто пытается преодолеть "жадность" регулярных выражений, у кого не спрашивал, кто работает на .НЕТ, никто не знает.
Сейчас-то проблема в том, что в результате работы Matches я получаю текст не между каждыми |~|, а между первым и последним в строке. И никак это не могу я побороть.
« Последнее редактирование: 04-07-2007 12:46 от nikedeforest » Записан

ещё один вопрос ...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 04-07-2007 15:03 » 

Тогда так попробуй:

\|~\|(?://~//)?(.*?)(?://~//)?\|~\|

« Последнее редактирование: 04-07-2007 15:05 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 08-07-2007 17:50 » 

Хм, перед отъездом проверил, но не успел тебе задать вопрос. ТО, что ты сейчас предлагаешь-очень хороший вариант, по крайней мере лучший из имеющихся.  Возвращается именно группа текста внутри |~|  |~|. Правда вместе с этим возвращается и |~|. Я сразу что сделал, так это попытался организовать группу (?Улыбаюсь, но это не помогает абсолютно, не оказывая никакого влияния вообще. Я не понимаю почему, если не сложно объясни. В принципе обрамление убрать из итога не сложно, мне просто интересно знать почему не работает конструкция (?Улыбаюсь, в этом варианте, может из-за этого и предыдущие варианты не работали
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 09-07-2007 08:45 » 

И уж тем более я не понимаю смысл необязательности центральной группы. Почему с ним именно все так как надо. Как-то все за уши получается притянуто Улыбаюсь, в смысле не логично для меня.
Записан

ещё один вопрос ...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 09-07-2007 17:51 » 

nikedeforest, тебе надо читать доку по ф-иям.
Для PCRE в C, Perl и PHP - возвращаются массивы, где первый элемент - что захватил шаблон, следующие - что захватили блоки.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 09-07-2007 18:21 » 

В .НЕТ также. Я хотел, чтобы шаблон сразу захватил только то, что между разделителями, т.е. была бы одна группа. А так получилось две группы.
Записан

ещё один вопрос ...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 09-07-2007 18:55 » 

Группа одна, а остальное - особенность ф-ий.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #15 : 18-10-2007 14:35 » 

Господа,

простите за тупость, но я никак не пойму, как применять этот самый Regex.Match...
Пример - в проекте соит:

Код:
            Match m  = Regex.Match( vlanId, @"^[0-9a-fA-F]{3}" );
            if( m.Length < 1 )
            {
                return false;
            }


Что это значит? Что он ищет? Что означает значок "^"? Ну и т.д.... Я синтаксис не пойму!!!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 18-10-2007 15:18 » 

Malaja, все довольно просто:

^ - указатель позиции на начало строки;
[0-9a-fA-F] - задание класса символов (здесь: все варианты шестнадцатеричных цифр);
{3} - квантификатор (здесь: ровно три символа).

Смысл выражения: в самом начале строки должно быть три шестнадцатеричных цифры.
« Последнее редактирование: 18-10-2007 15:20 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #17 : 18-10-2007 15:31 » 

Ром,

спасибочки! Но это еще не все Ага А что тогда ищется тут:

Regex.Match(commands, "^/L:([a-zA-Z]*-[a-zA-Z]*)(-[a-zA-Z]*)*$", RegexOptions.Compiled);

То, что я теперь могу расшифровать: в начале строки д.б. /Л:, а за ним маленькая или большая буква-маленькая или большая буква. А вот к чему тут "*" и все остальное?...

Я пыталась найти нормальную инфу, но пока не преуспела...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 18-10-2007 16:01 » 

* - квантификатор "0 или больше".
Круглые скобки используются для группировки (и выделения частей).
$ - позиция на конце строки.

Под данный пример годятся строки:
/L:--
/L:aaaa-KJH
/L:--QwerTY

Странное оно какое-то...

Нашел вот описание PCRE для PHP. Синтаксис выражений от языка не меняется, т.ч. пожно почитать тут:
http://ru2.php.net/manual/ru/reference.pcre.pattern.syntax.php
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #19 : 19-10-2007 08:52 » 

Ром,

спасибочки еще раз! Читаю!
Я поняла, почему сама не нашла инфу - искала напрямую про Regex.Match в с-шарп...

Заодно, я тут нашла 2 вещи на эту тему (может, это кому-то поможет):
1) есть книга "Mastering Regular Expressions", 3nd Edition
by Jeffrey E. F. Friedl
Но я не знаю, есть она в русском переводе... И пока не нашла ее в электронном варианте...

2) есть сайт: http://www.regular-expressions.info/dotnet.html
Короче, буду разбираться.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #20 : 19-10-2007 09:10 » new

нашла, в русском варианте название книги звучит так:

"Регулярные выражения. 2-е изд. Фридл Дж."

но вот где скачать хоть какой-то из двух вариантов, пока неясно Ага
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 19-10-2007 15:31 » 

Нашел книгу в осле - как скачается выложу.

Нашел кучу вариантов книг в трех редакциях - отобрал лучшее: залил 1-ю и 3-ю редакции книги. Обе на английском. Посмотреть можно тут: https://club.shelek.ru/viewfiles.php?id=45
« Последнее редактирование: 19-10-2007 19:09 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines