![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
kefi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 20.11.2008 Репутация: -2 Всего: -1 |
Такая задача :
Найти позицию начала последовательности подстрок <Str1>,<Str2>,...,<StrN>в хвосте строки Есть строка вида : <Один или более символов>[<Str1>][<Str2>]...[<StrN>] [<Str1>],[<Str2>],...,[<StrN>] - хвостовые подстроки стоят только в конце строки, и при этом могут как угодно между собой чередоваться ( повторяться можно, но лучше решить БЕЗ повторений , т.е. для хвоста wabbaab найти не 2-ю(с 1-цы считая), а 6-ю позицию ) . Например: "Это начало С1D1E1" или "Это начало E1C1" . Здесь [...] - синтаксис текста, который может быть опущен Нужно построить шаблон регулярного выражения находящего 1-ю позицию вхождения заданных хвостовых подстрок Str1,Str2,...,StrN и соовтетсвенно какой подстроке она соответствует. PS Вообще кроме этого желаетльно также найти и все позиции всех остальных хвостовых подстрок. НАпример для подстрок "a", "b", "c" : Pattern = "(a|b|c)$" testString="qabc" ну или testString="qcb" ну или testString="qbac" etc плохое решение так как находится только позиция последней подстроки "c", а нужно найти позицию первой полдстроки "a" . как это сделать ? Перенесено из последних постов : Решение : (((Str1)|(Str2)|(Str3))?(?!.*\2.*))+$ и Область применения : Ну и еще о практическом применении : нужно обработать командную строку вышеупомянутого вида, в конце которой стоят в произвольном порядке ключи, причем если эти же ключи в стречаются в самой строке , то семантически они должны рассматириваться уже не как ключи, а ка текст команды. <Команда с возможными включениями последовательностей символов тождественных ключевым><ключ1><ключ2><ключ3>... например : "Хочу мороженого,хочу пирожногоог" Ключ "о" - означает с оладьями Ключ "г" - означает с глазурью (ну это не важно, что они означают) шаблон (((о)|(г))?(?!.*\2.*))+$ сработает верно для такой строки , а вот первый вариант шаблона ((о)|(г))+$ сработает верно только для строки "Хочу мороженого,хочу пирожного ог" Это сообщение отредактировал(а) kefi - 22.11.2008, 16:16 |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
kefi,
как это сделать за Вас? Тогда в раздел Работа |
|||
|
||||
kefi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 20.11.2008 Репутация: -2 Всего: -1 |
Ух-ты - первыый пост в форуме и сразу на чудика нарвался ! |
|||
|
||||
tolkien |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
Разделите ваш большой шаблон на множество мелких. Уберите или
Pattern = ".+(a|b|c)$" ---> Pattern1= ".+a$" Pattern2= ".+b$" Pattern3= ".+c$" ищите по отдельности А хамить на форуме не надо. |
|||
|
||||
kefi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 20.11.2008 Репутация: -2 Всего: -1 |
Я тоже считаю , что хамить не надо - про хамство это не ко мне - это к shamber, который считает , что любой вопрос на форуме надо отсылать ему в "Работу" и платить ему за это ДЕНЬГИИИ , другими словами , что из всех разеделов на форуме нужно оставить только один "Работа" - вот это уже даже покруче, чем хамство , и моя реакция очень мягкая. А вопрос-то недалекий был , просто для меня - новичка в регексах - непонятный : Шаблон , как оказалось должен быть : "(a|b|c)+$" Может, обсудим теперь - как это все работает и придумаем как его усовершенствовать для получения позиции каждой подстроки в хвосте , Например, a,b,c для строки "qabc_acbac" , т.е. позиции 5,6,7,8,9 ( но не 1,2,3! ) ? Это сообщение отредактировал(а) kefi - 20.11.2008, 22:41 |
|||
|
||||
kefi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 20.11.2008 Репутация: -2 Всего: -1 |
Вот этот шаблон "((a)|(b)|©)+$",
только почему он работает - не могу догнать никак , может кто объяснит ? |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
kefi, в шаблоне указано, что ему соответствует подстрока с любым количеством и в любом порядке символов a, b и c (но только эти символы) в конце строки. Аналогично /[abc]+$/.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
kefi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 20.11.2008 Репутация: -2 Всего: -1 |
ginnie, да нет - читайте первый пост : вместо символов a,b,c примера могут быть любые последовательности символов
Тут возникла другая трабла, захотелось вот чего : Желательно, чтобы находилась позиция подстрок в хвосте и они начиная с нее НЕ ПОВТОРЯЛИСЬ . Т.е. , например ,для шаблона (a|b)+$ могут быть в конце строки найдены образцы, например : abbaab baaa bbabb Причем будет найдена первая позиция встречи этих образцов в хвосте строки, а нужно (ну точнее, желательно) , чтобы была найдена позиция выделенных кусков. Это сообщение отредактировал(а) kefi - 22.11.2008, 09:27 |
|||
|
||||
tolkien |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
Я честно пытался перевести то что вы выше написали но то что после bbabb не смог осилить
... Для шаблона (a|b)+$ соответ след. строки abbaab baaa bbabb Что нужно? Приведите пример полный что имеете вы на входе и что на выходе желаете получить |
|||
|
||||
kefi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 20.11.2008 Репутация: -2 Всего: -1 |
tolkien, пардон , просто в том посте http://forum.vingrad.ru/forum/topic-236991...1705379/0.html# куски в хвостах не выделил , сейчас исправил ( просто примените шаблон (a|b)+$ к строкам abbaab или baaa или bbabb , и Вы увидите, что будет найдена первая позиция вместо выделенных ) :
Кажись так в нотации перла : print "Это ab на последнем вхождении ?.." if 'abbaab' =~ /(a|b)+$/gis; ... Это сообщение отредактировал(а) kefi - 22.11.2008, 10:46 |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
kefi, по-прежнему не до конца понятно, что Вы хотите.
Присоединяюсь к просьбе tolkien дать пример реальной задачи (не упрощая ее до ab), что имеем на входе, что нужно получить на выходе. P.S. Возможно, Вам кажется, что Вы исчерпывающе объяснили суть проблемы, но, поверьте, это не так, и именно поэтому Вам не помогли с решением. |
|||
|
||||
tolkien |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
Вывод является первое вхождение подстрок а или b с конца строки. А вам что нужно? Чтобы вывод был какой? |
||||
|
|||||
kefi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 20.11.2008 Репутация: -2 Всего: -1 |
amg,
tolkien > Еще подкорректировал первый свой пост . И Вот, вроде нашел как добраться до групп с искомыми подстроками : (((a)|(b)|©?(?!.*\2.*))+$ це в скобках упорно превращается в посте в © 0 группа - внешние скобки (...)+ 1 группа - скобки ((a)|(b)|©)? 2 группа - скобки (a) 3 группа - скобки (b) 4 группа - скобки © НАпример для 'abcb' =~/(((a)|(b)|©)?(?!.*\2.*))+$/gis (perl) будут для коллекции SubMatches (vbs) уже найдены для подстроки "a" - пусто, "b" - "b" и "c" - "c" на соответсвенно 2,3 и 4 местах колекции SubMatches. Вот только еще не понял - а 5 группа (?!.*\2.*) - вроде как и не группа для сравнения что ли? Ее как-то не находится вообще ? Может кто понимает ? Это сообщение отредактировал(а) kefi - 22.11.2008, 13:57 |
|||
|
||||
kefi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 20.11.2008 Репутация: -2 Всего: -1 |
Ну и еще о практическом применении :
нужно обработать командную строку вышеупомянутого вида, в конце которой стоят в произвольном порядке ключи, причем если эти же ключи в стречаются в самой строке , то семантически они должны рассматириваться уже не как ключи, а ка текст команды. <Команда с возможными включениями последовательностей символов тождественных ключевым><ключ1><ключ2><ключ3>... например : "Хочу мороженого,хочу пирожногоог" Ключ "о" - означает с оладьями Ключ "г" - означает с глазурью (ну это не важно, что они означают) шаблон (((о)|(г))?(?!.*\2.*))+$ сработает верно для такой строки , а вот первый вариант шаблона ((о)|(г))+$ сработает верно только для строки "Хочу мороженого,хочу пирожного ог" Это сообщение отредактировал(а) kefi - 22.11.2008, 14:34 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |