#regex
#регулярное выражение
Вопрос:
Я использую приложение, требуемое этим проектом, которое должно использовать входные данные регулярного выражения для предварительной фильтрации данных, которые могут поступать из html / javascript.
Я прочитал статью, осуждающую использование регулярных выражений, фильтрующих html; Однако я должен в этой ситуации.
Проблема, с которой мне нужна помощь (которая, похоже, не может быть легко объяснена), заключается в поиске ТЕГОВ, которые содержатся в data_1.
<TAG>
.
..
...
data_1
...
..
.
</TAG>
Я пробовал много разных подходов, однако мой общий опыт работы с регулярными выражениями ограничен.
Пример 1:
<TAG.*bdata_1b.*?/TAG>
Не работает, поскольку фактически захватывает первое существующее, проходящее мимо /TAG>, пока не найдет «data_1», а затем завершается следующим /TAG>
Я знаю, что в настоящее время я на правильном пути, однако я начал изучать регулярное выражение около 2 дней назад и еще не совсем там.
Любые ссылки, комментарии, советы были бы весьма признательны.
Редактировать
Он по-прежнему выбирает все предыдущие ТЕГИ.
***BEGIN***
<TAG>
....
.....
</TAG>
<TAG>
...
data_1
...
</TAG>
***END***
Когда это должно быть:
<TAG>
....
.....
</TAG>
***BEGIN***
<TAG>
...
data_1
...
</TAG>
***END***
Ответ №1:
Это регулярное выражение, вероятно, сработало бы:
<TAG>(?!.*?</TAG>.*?data_1).*?data_1.*?</TAG>
Вы можете увидеть результат здесь: http://regexr.com ?2v5qt
Комментарии:
1. Спасибо! Вы делаете (псевдонимо): находите ТЕГ, проверяете, есть ли соответствующий конечный ТЕГ между начальным ТЕГОМ и желаемым data_1. Если true, перейдите к КОНЕЧНОМУ ТЕГУ …. Если выполнены все условия, сопоставьте! Даже если это полу-правильный ход мыслей, является ли ошибочной логикой думать, что регулярное выражение работает (в глубине души) аналогично условным операторам? Или такова природа языка? Я читаю книгу, которая умоляет нас читать РЕГУЛЯРНОЕ выражение так, как оно задумано: <TAG> следует рассматривать как «match ‘<‘ затем сопоставьте ‘T’ затем сопоставьте ‘A’ затем сопоставьте ‘G’ затем сопоставьте ‘>’
2. Да, ваша интерпретация шаблона верна. Я не могу дать никакой полезной информации о том, как работает regex здесь, но ссылка, которую я разместил, — отличный эксперимент с регулярными выражениями, и вот еще один отличный ресурс: regular-expressions.info/reference.html
Ответ №2:
Вам нужно сделать так, чтобы все совпадения с подстановочными знаками ( .*
) не были жадными ( .*?
), и вам также может понадобиться переключатель «точка соответствует новой строке» <?s>
. Я также очистил ваши <TAG>
литералы
<?s>(<TAG>.*?bdata_1b.*?</TAG>)
Вы не говорите, какой язык вы используете, но если вы возьмете группу с номером 1 для каждого соответствия, у вас будут свои теги
Комментарии:
1. Тестирование, похоже, не дает правильного результата. Я еще немного поработаю с этим, прежде чем вернуться.