Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > Как вырезать подстроку из результата поиска?


Автор: skripnik 15.3.2011, 19:24
Допустим, на входе есть такие строки:

1. Иван сказал: «Выпьем, так сказать, за знакомство»
2. Борис отметил: «Да вы, так сказать, пижон, сударь»
3. Семён подытожил: «Сегодня грядёт, так сказать, пир на весь мир»

На выходе нужно получить:

1. Выпьем за знакомство
2. Да вы пижон, сударь
3. Сегодня грядёт пир на весь мир

Как это сделать с помощью PCRE? Какой должен быть шаблон? Что-то типа этого?
Код
/.*: «(.*(?:, так сказать, ).*)»/

Но оно всё равно «так сказать» не вырезает из результатов поиска. Эта задача вообще решаема средствами PCRE?

P. S. В том-то и заковырка, что нужно обойтись именно регулярными выражениями. Хочу понять, возможно ли это или же придётся усложнять логику функции в PHP. Задача на самом деле куда сложнее, это только для наглядности такой простой пример приведён.

Автор: alezzz 15.3.2011, 19:48
С PCRE не сталкивался, но судя по вашему выражению резальтат вы берете с первых сохраняющих скобок, но в них же входит и содержимое вторых скобок, не сохраняющих, просто результат совпадения не сохряняется в отдельную переменную. Попробуйте таким выражением с сохранением результата $1 и $2:
Код

/.*: «(.*?), так сказать,(.*?)»/

Автор: ming 15.3.2011, 20:10
Код

s/^.+?«|, так сказать,|».*$//;


Но учитывая тот факт, что
Цитата
Несколько простых регулярных выражений работают быстрее, чем одно сложное

то в случаях когда критично быстродействие, лучше применить серию:
Код

s/^.+?«//;
s/».*$//;
s/, так сказать,//;

Автор: alezzz 15.3.2011, 21:15
Цитата(ming @  15.3.2011,  20:10 Найти цитируемый пост)
код Perl1:s/^.+?«|, так сказать,|».*$//;

к такому варианту /g в конце надо добавить

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)