nikedeforest
|
|
« : 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
|
|
« Ответ #1 : 03-07-2007 19:17 » |
|
nikedeforest, попробуй первый блок тоже "?:" сделать Кстати, а поддерживают ли эти регулярные выражения "заглядывание", как в perl? Блоки типа (?= ) и (?<= )
|
|
« Последнее редактирование: 03-07-2007 19:20 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
nikedeforest
|
|
« Ответ #2 : 04-07-2007 05:15 » |
|
Сейчас попробую. "заглядывания" поддерживают
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
nikedeforest
|
|
« Ответ #3 : 04-07-2007 05:56 » |
|
имелось ввиду (?:(?:|~|(//~//)?)(.*)(?:(//~//)?|~|))+?
Эффект тот же
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
nikedeforest
|
|
« Ответ #4 : 04-07-2007 08:07 » |
|
Вот еще пример строка some of text|~|some text|~||~|other text|~||~|//~//more text//~//|~|cbcvbcvbcb some ert some
шаблон результат of text|~|some text|~||~|other text|~||~|//~//more text//~//|~|cbcvbcvbcb some ert
А хочу, чтоб было Пробовал ((?<=some).+(?=some))?? - результат пустая строка ((?<=some).+(?=some))+? - результат тот же, что в шаблоне, который я привел самым первым
|
|
« Последнее редактирование: 04-07-2007 08:19 от nikedeforest »
|
Записан
|
ещё один вопрос ...
|
|
|
RXL
|
|
« Ответ #5 : 04-07-2007 10:00 » |
|
Я думаю, тебе не match надо, а split - так проще будет.
Попробуй этим резать:
(?://~//)?\|~\|(?://~//)?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
nikedeforest
|
|
« Ответ #6 : 04-07-2007 12:06 » |
|
мне как бы не разбить же надо. Требуется получить то, что обрамлено определенными символами. А это, сам понимаешь не совсем тоже самое. Но походу дела, придется этим воспользоваться, потому какт я уже не знаю что придумать, чтобы MAtch не склеивал результат.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #7 : 04-07-2007 12:21 » |
|
Никита, а нельзя вставлять какой то определенный символ также? Например "|". А потом можно сделать split строки.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
nikedeforest
|
|
« Ответ #8 : 04-07-2007 12:43 » |
|
Виктор, сплитом можно сделать. Варианты как сделать иначе есть, RXL предложил неплохой вариант, просто регулярными выражениями было бы правильнее и надежнее и не казалось мне тогда, что я так и не смогу победить эту проблему. Удивительно, складывается впечатление, что я первый, кто пытается преодолеть "жадность" регулярных выражений, у кого не спрашивал, кто работает на .НЕТ, никто не знает. Сейчас-то проблема в том, что в результате работы Matches я получаю текст не между каждыми |~|, а между первым и последним в строке. И никак это не могу я побороть.
|
|
« Последнее редактирование: 04-07-2007 12:46 от nikedeforest »
|
Записан
|
ещё один вопрос ...
|
|
|
RXL
|
|
« Ответ #9 : 04-07-2007 15:03 » |
|
Тогда так попробуй:
\|~\|(?://~//)?(.*?)(?://~//)?\|~\|
|
|
« Последнее редактирование: 04-07-2007 15:05 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
nikedeforest
|
|
« Ответ #10 : 08-07-2007 17:50 » |
|
Хм, перед отъездом проверил, но не успел тебе задать вопрос. ТО, что ты сейчас предлагаешь-очень хороший вариант, по крайней мере лучший из имеющихся. Возвращается именно группа текста внутри |~| |~|. Правда вместе с этим возвращается и |~|. Я сразу что сделал, так это попытался организовать группу (? , но это не помогает абсолютно, не оказывая никакого влияния вообще. Я не понимаю почему, если не сложно объясни. В принципе обрамление убрать из итога не сложно, мне просто интересно знать почему не работает конструкция (? , в этом варианте, может из-за этого и предыдущие варианты не работали
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
nikedeforest
|
|
« Ответ #11 : 09-07-2007 08:45 » |
|
И уж тем более я не понимаю смысл необязательности центральной группы. Почему с ним именно все так как надо. Как-то все за уши получается притянуто , в смысле не логично для меня.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
RXL
|
|
« Ответ #12 : 09-07-2007 17:51 » |
|
nikedeforest, тебе надо читать доку по ф-иям. Для PCRE в C, Perl и PHP - возвращаются массивы, где первый элемент - что захватил шаблон, следующие - что захватили блоки.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
nikedeforest
|
|
« Ответ #13 : 09-07-2007 18:21 » |
|
В .НЕТ также. Я хотел, чтобы шаблон сразу захватил только то, что между разделителями, т.е. была бы одна группа. А так получилось две группы.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
RXL
|
|
« Ответ #14 : 09-07-2007 18:55 » |
|
Группа одна, а остальное - особенность ф-ий.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Malaja
|
|
« Ответ #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
|
|
« Ответ #16 : 18-10-2007 15:18 » |
|
Malaja, все довольно просто:
^ - указатель позиции на начало строки; [0-9a-fA-F] - задание класса символов (здесь: все варианты шестнадцатеричных цифр); {3} - квантификатор (здесь: ровно три символа).
Смысл выражения: в самом начале строки должно быть три шестнадцатеричных цифры.
|
|
« Последнее редактирование: 18-10-2007 15:20 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Malaja
|
|
« Ответ #17 : 18-10-2007 15:31 » |
|
Ром, спасибочки! Но это еще не все А что тогда ищется тут: Regex.Match(commands , "^/L:([a-zA-Z]*-[a-zA-Z]*)(-[a-zA-Z]*)*$", RegexOptions.Compiled);
То, что я теперь могу расшифровать: в начале строки д.б. /Л:, а за ним маленькая или большая буква-маленькая или большая буква. А вот к чему тут "*" и все остальное?...
Я пыталась найти нормальную инфу, но пока не преуспела...
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
RXL
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #20 : 19-10-2007 09:10 » |
|
нашла, в русском варианте название книги звучит так: "Регулярные выражения. 2-е изд. Фридл Дж." но вот где скачать хоть какой-то из двух вариантов, пока неясно
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
RXL
|
|
« Ответ #21 : 19-10-2007 15:31 » |
|
Нашел книгу в осле - как скачается выложу. Нашел кучу вариантов книг в трех редакциях - отобрал лучшее: залил 1-ю и 3-ю редакции книги. Обе на английском. Посмотреть можно тут: https://club.shelek.ru/viewfiles.php?id=45
|
|
« Последнее редактирование: 19-10-2007 19:09 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|