Регулярное выражение - штраф назад, а не вперед Textmate - PullRequest
0 голосов
/ 25 апреля 2011

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

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

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

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

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

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2011

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

0 голосов
/ 25 апреля 2011

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

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

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

...