#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 это режим по умолчанию, и его нельзя изменить.