Link zwrotny Vim regex


Chce to zrobić:
%s/shop_(*)/shop_\1 wp_\1/

Dlaczego
shop _ (*) ​​
nie pasuje do niczego?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jest tu kilka problemów.
  • Pareny wyrażeń regularnych vima nie są przeznaczone do przechwytywania - do przechwytywania musisz użyć
    \ (\)
    .
  • *
    nie oznacza tego, co myślisz. Oznacza to „0 lub więcej poprzednich”, więc Twoje wyrażenie regularne oznacza „ciąg zawierający
    sklep_
    , po którym następuje 0+
    (
    , po którym następuje literał
    )
    . Szukasz
    .
    , co w wyrażeniu regularnym oznacza „dowolny znak”. Razem z gwiazdką
    . *
    oznacza „0 lub więcej dowolnego znaku”. Prawdopodobnie potrzebujesz co najmniej jednego znaku, więc użyj
    . \ +
    (
    +
    oznacza „1 lub więcej poprzednich”)

Użyj tego:
% s/shop _ \ (. \ + \)/Shop_ \ 1 wp_ \ 1/
.
Opcjonalnie zakończ go znakiem
g
po ostatnim ukośniku, aby zastąpić wszystkie wystąpienia w tym samym wierszu, a nie tylko pierwsze.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli dobrze rozumiem, chcesz
% s/shop _ \ (. * \)/Shop_ \ 1 wp_ \ 1/
Wyrwij się z nawiasu przechwytującego i użyj
. *
, aby dopasować dowolną liczbę dowolnego znaku.
(Twoje wyszukiwanie wyszukuje wyrażenie „shop_”, po którym następuje dowolna liczba nawiasów otwierających, po których następuje nawias zamykający)

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się