LINUX.ORG.RU

Группировка «или» в регекспах в виме и экранирование.

 , ,


0

2

Насколько я понял, в виме группировка создается в экранированных скобках. Например,

s/\((\).*\()\)/\1\2/g --> foo(foo)foo --> foo()foo -- работает, а

s/(\().*(\))/\1\2/g --> foo(foo)foo --> паттерн не найден
То есть, похоже, все наоборот. В соответствии с этим синтаксисом я написал вот такое выражение
s/\((\|<\).*\()\|>\)/\1\2/g --> foo(foo)foo --> foo()foo
s/\((\|<\).*\()\|>\)/\1\2/g --> foo<foo>foo --> foo()foo
Которое работает нормально. Однако, если добавить в него еще скобок:
s/\((\|<\|{\|[\).*\()\|>\|}\|]\)/\1\2/g
Уже не работает.

вот так вроде работает:

s/\([(<{\[]\).*\([)>}\]]\)/\1\2/g
Я уж было подумал, что квадратные скобки надо всегда экранировать. Но не тут то было
s/\((\|<\|{\|\[).*\()\|>\|}\|\]\)/\1\2/g
опять не работает.

Собственно, хотелось бы понять, некий общий принцип, по которому в виме экранируются и группируются символы.

И, кстати, почему они так сделали экранирование, через жопу? Нельзя ли сделать, чтобы работало как обычно?

спасибо.



Последнее исправление: terminator-101 (всего исправлений: 1)

Сколько пользовался в основном регекспы вима совпадают с тем же sed. Так что скорее всего это и есть общее правило. Только у sed свои заморочки экранирования экранирования из-за оболочки, а в виме проще.

А что ты хочешь сделать?

ziemin ★★
()

И, кстати, почему они так сделали экранирование, через жопу? Нельзя ли сделать, чтобы работало как обычно?

Как обычно лично для тебя? Это не pcre, да. Но вот в, скажем, sed это и есть «как обычно».

liaonau
()
Ответ на: комментарий от ziemin

Ну я изначально хотел написать команду удаления внутри любызх скобок. Ну, собственно, вот так работает

s/\([(<{\[]\).*\([)>}\]]\)/\1\2/g
Только не знаю как ленивость сделать (ограничить жадность), че-то ? тоже не работает:) ну это ладно, я просто на будущее интересуюсь, как бы.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Только не знаю как ленивость сделать

[^)] вместо точки, чтобы ДО следующей закрывающей скобки. Я вижу ты и регекспов-то толком не знаешь. А сразу на вим бочку катишь.

ziemin ★★
()
Ответ на: комментарий от terminator-101

ограничить жадность

\{-} matches 0 or more of the preceding atom, as few as possible

прочитай :help pattern.txt, прежде чем создавать тему с заявлением о черезжопности vim.

liaonau
()
Ответ на: комментарий от liaonau

\{-} matches 0 or more of the preceding atom, as few as possible

Я не понял. .* и так жадный. Мне ограничить надо было. Я имею в виду что-то вроде .*?

terminator-101
() автор топика

Погуглите табличку сравнивающую vim регекспы и pcre.

salsa
()

И, кстати, почему они так сделали экранирование, через жопу? Нельзя ли сделать, чтобы работало как обычно?

Потому что VIM сделали из VI, а VI в свою очередь это, по большому счёту, визуализированный SED на стероидах.

q11q11 ★★★★★
()
Ответ на: комментарий от terminator-101

Я не понял. .* и так жадный. Мне ограничить надо было. Я имею в виду что-то вроде .*?

Так и написано:

as few as possible

т.е. не жадный.

xaizek ★★★★★
()

Нельзя ли сделать, чтобы работало как обычно?

См. :help /magic на тему режимов «magic» и «very magic», меньше экранировать надо будет.

И, кстати, почему они так сделали экранирование

Потому что спецсимволы часто встречаются в коде, а так их искать проще.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

т.е. не жадный.

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

s/\([(<{\[]\).*\{-\}\([)>}\]]\)/\1\2/g
s/\([(<{\[]\).*\{-}\([)>}\]]\)/\1\2/g
хренотень не работает, конечно же.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Это не модификатор квантификатора, а квантификатор сам по себе, т.е. *? === \{-} и надо писать:

s/\([(<{\[]\).\{-}\([)>}\]]\)/\1\2/g

Слеш перед } необязателен.

xaizek ★★★★★
()
Ответ на: комментарий от terminator-101

Вариант 0: программа глючит

Вариант 1: у неё дурацкий интерфейс и ваапще

Вариант 2: нудная документация

Без вариантов: у меня кривые руки.

ziemin ★★
()

Зашёл в тред и разочаровался.

Deleted
()
Ответ на: комментарий от ziemin

Да, ты прав, это эквивалентные регулярки. И обе они делают не совсем то, что мне нужно:)

terminator-101
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.