Идентификация большой строки информации, содержащей определенные данные

#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. Тестирование, похоже, не дает правильного результата. Я еще немного поработаю с этим, прежде чем вернуться.