Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> найти позиции заданных подстрок в конце, регулярное выражение 
:(
    Опции темы
kefi
Дата 20.11.2008, 15:16 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
shamber
Дата 20.11.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



kefi
как это сделать за Вас? 
Тогда в раздел Работа
PM MAIL Jabber   Вверх
kefi
Дата 20.11.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.11.2008

Репутация: -2
Всего: -1



Цитата(shamber @ 20.11.2008,  16:02)
kefi
как это сделать за Вас? 
Тогда в раздел Работа >


Ух-ты - первыый пост в форуме и сразу на чудика нарвался !
PM MAIL   Вверх
tolkien
Дата 20.11.2008, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Разделите ваш большой шаблон на множество мелких.  Уберите или
Pattern = ".+(a|b|c)$"   ---> Pattern1= ".+a$" Pattern2= ".+b$" Pattern3= ".+c$"
ищите по отдельности

А хамить на форуме не надо. 
PM MAIL   Вверх
kefi
Дата 20.11.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.11.2008

Репутация: -2
Всего: -1



Цитата(tolkien @ 20.11.2008,  18:54)
Разделите ваш большой шаблон на множество мелких.  Уберите или
Pattern = ".+(a|b|c)$"   ---> Pattern1= ".+a$" Pattern2= ".+b$" Pattern3= ".+c$"
ищите по отдельности

А хамить на форуме не надо.

  Я тоже считаю , что хамить не надо  - про хамство это не ко мне - это к shamber, который считает , что любой вопрос на форуме надо отсылать ему в "Работу" и платить ему за это ДЕНЬГИИИ , другими словами , что  из всех разеделов на форуме нужно оставить только один  "Работа" - вот это уже даже покруче, чем хамство ,  и моя реакция очень мягкая.

А вопрос-то  недалекий был , просто для меня - новичка в регексах  -  непонятный :
Шаблон , как оказалось должен быть :  "(a|b|c)+$" 

Может, обсудим теперь - как это все работает и придумаем как его усовершенствовать  для получения позиции каждой подстроки в хвосте , Например, a,b,c  для строки "qabc_acbac" , т.е. позиции 5,6,7,8,9  ( но не 1,2,3! ) ?



Это сообщение отредактировал(а) kefi - 20.11.2008, 22:41
PM MAIL   Вверх
kefi
Дата 20.11.2008, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.11.2008

Репутация: -2
Всего: -1



Вот этот шаблон "((a)|(b)|©)+$",
 только почему он работает - не могу догнать никак , может кто объяснит ?

PM MAIL   Вверх
ginnie
Дата 21.11.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



kefi, в шаблоне указано, что ему соответствует подстрока с любым количеством и в любом порядке символов a, b и c (но только эти символы) в конце строки. Аналогично /[abc]+$/.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
kefi
Дата 21.11.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.11.2008

Репутация: -2
Всего: -1



ginnie, да нет - читайте первый пост : вместо символов a,b,c примера могут быть любые последовательности символов

Тут возникла другая трабла, захотелось вот чего : 

Желательно, чтобы находилась позиция подстрок в хвосте и они начиная с нее НЕ ПОВТОРЯЛИСЬ .

Т.е. , например ,для шаблона (a|b)+$ могут быть в конце строки найдены образцы, например :
abbaab
baaa
bbabb
Причем будет найдена первая позиция встречи этих образцов в хвосте строки, а нужно (ну точнее, желательно) , чтобы была найдена позиция выделенных кусков.

Это сообщение отредактировал(а) kefi - 22.11.2008, 09:27
PM MAIL   Вверх
tolkien
Дата 21.11.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Я честно пытался перевести то что вы выше написали но то что после bbabb не смог осилить 
...
Для шаблона (a|b)+$ соответ след. строки 
abbaab
baaa
bbabb


Что нужно? Приведите пример полный что имеете вы на входе и что на выходе желаете получить 
PM MAIL   Вверх
kefi
Дата 22.11.2008, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
amg
Дата 22.11.2008, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



kefi, по-прежнему не до конца понятно, что Вы хотите.
Присоединяюсь к просьбе tolkien дать пример реальной задачи (не упрощая ее до ab), что имеем на входе, что нужно получить на выходе.

P.S. Возможно, Вам кажется, что Вы исчерпывающе объяснили суть проблемы, но, поверьте, это не так, и именно поэтому Вам не помогли с решением.
PM MAIL   Вверх
tolkien
Дата 22.11.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Цитата(kefi @ 22.11.2008,  09:34)
tolkien, пардон , просто в том посте http://forum.vingrad.ru/forum/topic-236991...1705379/0.html# куски в хвостах не выделил , сейчас исправил ( просто примените шаблон (a|b)+$ к строкам abbaab или baaa или bbabb , и Вы увидите, что будет найдена первая позиция вместо выделенных ) :
Кажись так в нотации перла :
 print "Это ab на последнем вхождении ?.." if 'abbaab' =~ /(a|b)+$/gis;
 ...

Код

print $1,"\n" if ('abbaab' =~ m/(a|b)+$/gis);
print $1,"\n" if ('baaa' =~ m/(a|b)+$/gis);
print $1,"\n" if ('bbabb' =~ m/(a|b)+$/gis);

Вывод:
b
a
b


Вывод является первое вхождение подстрок а или b с конца строки.

А вам что нужно? 
Чтобы вывод был какой? 
PM MAIL   Вверх
kefi
Дата 22.11.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
kefi
Дата 22.11.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.11.2008

Репутация: -2
Всего: -1



Ну и еще о практическом применении :
нужно обработать командную строку вышеупомянутого вида, в конце которой стоят в произвольном порядке ключи, причем если эти же ключи в стречаются в самой строке , то семантически они должны рассматириваться уже не как ключи, а ка текст команды.
<Команда с возможными включениями последовательностей символов тождественных ключевым><ключ1><ключ2><ключ3>...
например : "Хочу мороженого,хочу пирожногоог"
Ключ "о" - означает с оладьями
Ключ "г" - означает с глазурью (ну это не важно, что они означают)

шаблон (((о)|(г))?(?!.*\2.*))+$ сработает верно для такой строки , 

а вот первый вариант шаблона ((о)|(г))+$ сработает верно только  для строки "Хочу мороженого,хочу пирожного ог"


Это сообщение отредактировал(а) kefi - 22.11.2008, 14:34
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0853 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.