2013-08-19 26 views
10

Niedawno natknąłem się na specyfikator gałęzi w wbudowanych modułach Vime regex. sekcja pomocy Vima na \& zawiera to:Co to jest & wzór w Regimie Vima

A branch is one or more concats, separated by "\&". It matches the last 
concat, but only if all the preceding concats also match at the same 
position. Examples: 
     "foobeep\&..." matches "foo" in "foobeep". 
     ".*Peter\&.*Bob" matches in a line containing both "Peter" and "Bob" 

Nie jest jasne, w jaki sposób jest on używany i co się go stosuje. Dobre wyjaśnienie tego, co robi i jak jest używane, byłoby świetne.

być jasne jest nie& (zamiast z całego meczu) stosowane w podstawienie, to \& stosowane w układzie.

Przykład użycia:

/\c\v([^aeiou]&\a){4} 

używany do wyszukiwania kolejnych 4 spółgłosek (wzięte z vim wskazówek).

+0

Jeśli można utworzyć łącze do strony wiki lub strony man, w której to przeczytałeś, byłoby wspaniale? –

+0

@Sniffer ': help pattern'. – mhinz

+0

@mhinz Używam systemu Windows w tym czasie i nie mam VIM, ale w każdym razie wydaje się, że znasz odpowiedź, więc jest w porządku. Dzięki. –

Odpowiedz

14

Objaśnienie:

\& jest \|, co operator i jest operatorem lub. Tak więc oba konkusy muszą się zgadzać, ale tylko ostatni będzie podświetlony.

Przykład 1:

(Poniższe testy zakładają :setlocal hlsearch.)

Wyobraź ten ciąg:

foo foobar 

Teraz /foo zaprezentuje foo w obu słów. Ale czasami po prostu chcesz dopasować foo w foobar. Następnie musisz użyć /foobar\&foo.

Tak to działa. Czy często jest używany? Nie widziałem tego więcej niż kilka razy. Większość ludzi prawdopodobnie użyje atomów o zerowej szerokości w takich prostych przypadkach. Na przykład. taki sam jak w tym przykładzie można wykonać przez /foo\zebar.

Przykład 2:

/\c\v([^aeiou]&\a){4}.

\c - zignorować przypadek

\v - "bardzo magia" (-> nie trzeba uciekać się & w tym przypadku)

(){4} - powtarzanie tego samego wzoru 4 razy

[^aeiou] - wykluczyć te znaki

\a - alfabetyczny znak

Zatem to raczej mylące, wyrażenie regularne będzie pasować xxxx, XXXX, wXyZ lub WxYz ale nie AAAA lub xxx1.Mówiąc prosto: dopasuj dowolny ciąg 4 znaków alfabetu, które nie zawierają ani "a", "e", "i", "o" ani "u".

+0

Bardzo ładne wyjaśnienie. –

+0

@Sniffer Uwaga: we wszystkich przypadkach konkat może zostać zastąpiony pozytywnym spojrzeniem o zerowej szerokości ('a \ & b \ & c' jest zawsze' \% (a \) \ @ = \% (b \) \ @ = c ', zastanawiając się, dlaczego o tym nie wspomniałeś, masz tylko kilka słów o atomach o zerowej szerokości). Patenty wyprzedzające/wyglądające z tyłu są mocniejsze od konkataków i rozsądnie jest przyzwyczaić się do ich używania tylko dlatego, że kiedy uczysz się nowego silnika regexp, jest znacznie bardziej prawdopodobne, że nie będzie on obsługiwał ani wyprzedzania, ani konkatencji, czy też będzie wspierał tylko wygląd -powiedzi raczej mają poparcie dla konkat. – ZyX

+0

Należy również zauważyć, że '\ zs' używany jako szerokość zerowa jest błędny: spróbuj wyszukać'. \ Zso' za pomocą 'foo' w buforze i porównaj wynik z'. \ @<= O'. Nie znam błędu dla '\ ze' chociaż. – ZyX