Регулярные выражения perl
[^(IF|ELSE|ENDIF)]А это что за конструкция? В [] вроде символы только указываются, а не слова.
В том-то и дело, это результат моего творческого подхода.
^(.*?IF|ELSE|ENDIF?:.(?!IF|ELSE|ENDIF+)
выберет кусок текста от начала строки до первого IF/..., само ключевое слово, и всё последующее до очередного ключевого слова.
выберет кусок текста от начала строки до первого IF/..., само ключевое слово, и всё последующее до очередного ключевого слова.Спасибо, неплохая идея, а как быть, если следующего нет?
Тогда просто дойдёт до конца
^.*?\bIF\b.*?\bELSE\b.*?\bENDIF\b.*$
/^(.*?)\[(IF|ELSE|ENDIF\s*[^\]]*)\]?:.(?!\[IF|\[ELSE|\[ENDIF+.*)$/s
Вот такой окончательный вид приняло выражение. Все спасибо. Отдельно большое спасибо =)
Можешь сократить до [^\]]*
(\s*[^\]]*)
Кстати, у тебя поймается например такое:
[IFhello I'm Muzzy] I like clocks
ты не мудри, покажи пальцем, что тебе выдрать надо, кусок текста кинь который парсишь
Это такой вид троллинга - показать неработающую регулярку :-)
<tr>
<td><p>
[IF field="Администрация"]
[Дата format="date:DD.MM.YY"]<br>
<b>Администрация:</b> <i>[Отзыв]</i><br>
[ELSE]
[Дата format="date:DD.MM.YY"]<br>
<b>ФИО:</b> [ФИО]<br>
<b>Оценка:</b> [Оценка]<br>
<b>Род занятий:</b> [РодЗанятий]<br>
<b>Возраст:</b> [Возраст]<br>
<b>Отзыв:</b> [Отзыв]<br>
[ENDIF]
<table style="margin-left: 30px;">
[children order="Дата"]
</table>
</td>
</tr>
В общем случае должна быть вложенность конструкции IF ELSE ENDIF.
1. Сначала нужно получить самую первую, если нет, то заканчиваем.
2. Проверить условие и оставить в тексте подходящий блок. Шаг 1.
А вложенные ифы у тя бывают?
У меня пока еще не было. Но, думаю, необходимость возникнет.
FYI: вложенные конструкции не ловятся чистыми регулярками, пиши нормальный парсер сразу лучше
Ну так для этого я и лювлю первое вхождение. Есть счетчик блоков if и el. когда if = 1 el = 1, значит дошли до else от первого if. if = 0 el = 0 значит конец блока else.
зы
хотя под perl едва ли будет реализация
Спасибо, интересная штуковина. В перспективе очень пригодится.
Can I use Perl regular expressions to match balanced text? .
Но если грамматика более-менее сложная, лучше и правда использовать что-нибудь другое.
Вот, например, есть Marpa. Это не peg, это универсальный bnf-парсер.
В perl 5.10 можно использовать рекурсию в регэкспах, и соответственно матчить вложенные выражения:
может пригодитсяНо если грамматика более-менее сложная, лучше и правда использовать что-нибудь другое.
Вот, например, есть Marpa. Это не peg, это универсальный bnf-парсер.
Оставить комментарий
IG_rok777
Добрый вечер, уважаемые гуру. Мучает меня проблема.Есть регулярное выражение, которое отыскивает первое вхождение [IF ...]|[ELSE]|[ENDIF] и запоминает окружающий их текст.
Никак не могу заставить его работать. Помогите, пожалуйста
Составил максимум вот это: /^([^(IF|ELSE|ENDIF)]*)\[(IF|ELSE|ENDIF\s)*([^\]\[]*)\](.*)$/s
Этот шаблон не хочет искать, когда перед IF, ELSE или ENDIF встречается, например, точка. Не знаю как остальные символы (буквы, скобки, двоеточие все катит но это как признак того, что шаблон составлен не правильно.
Чую, что нужно использовать конструкцию (?<! шаблон но не знаю как.
Или может использовать ленивый алгоритм поиска и не заморачиваться с проверкой не вхождения (IF, ELSE, ENDIF) вначале, но опять же, не знаю как.