Проблема с регулярным выражением — исправляется в обратном направлении и не пересылает Textmate

#regex #textmate #oniguruma

#регулярное выражение #textmate #онигурума

Вопрос:

Я не очень хорошо разбираюсь в регулярных выражениях, но в Textmate я пытаюсь очистить несколько строк в XML-файле, который выглядит как

 <comments>
    <sub_node>....
....
</comments>
  

и я использую это в поиске / замене на regex,

 <comments>(?m:.*)</comments>
  

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

Если я выполняю поиск предыдущего (в обратном направлении) из последней строки, он правильно захватывает блок. Я не уверен, что я здесь делаю не так, и может ли кто-нибудь даже предложить гораздо более эффективный способ сделать это.

Спасибо.

Ответ №1:

Вам нужно использовать не жадные квалификаторы. Я ничего не знаю о Textmate, поэтому я не знаю, поддерживает ли он их. Если этого не происходит, вы можете выполнить поиск, за <comments> которым следует любое количество элементов, за которыми не </comments> следует <comments> . (Это была бы более конкретная помощь, но ваш опубликованный пример незнаком и, должно быть, является некоторой странностью Textmate.)

Комментарии:

1. да, спасибо за информацию, думаю, я должен сделать это более конкретно.

Ответ №2:

Для меня это звучит как совершенно нормальное поведение. Вам просто нужно использовать неохотный квантификатор, что означает добавление ? , вот так:

 <comments>(?m:.*?)</comments>
  

Единственной странностью здесь является модификатор m (для «многострочного»), который позволяет . метасимволу соответствовать новым строкам. Большинство вариантов регулярных выражений вызывают этот режим «однострочный» или «совпадающий со всеми точками» и используют s для его указания. Эти варианты, как правило, также поддерживают m / «многострочный» режим, который изменяет поведение ^ и $ якорей. В TextMate это режим по умолчанию, и его нельзя изменить.