2013-08-19 31 views
10

'daki \ & desen nedir? Son zamanlarda Vim regex yerleşkelerindeki şube belirtecine rastladım. \& tarihinde Vim'ın yardım bölümü bu içerir:Vim Regex

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" 

O nasıl kullanıldığını net değil ve ne için kullanılır. Ne yaptığı ve nasıl kullanıldığıyla ilgili iyi bir açıklama harika olurdu.

bu değil bir değişiklik kullanılan & (bütün maç değiştirmek), bu modelde kullanılan \& olan olan temiz olması için.

Örnek kullanım:

4 ardışık ünsüzler aramak için kullanılır
/\c\v([^aeiou]&\a){4} 

(vim ipuçları Alınan).

+0

Bunu okuduğunuz yer olan wiki veya man sayfasına bağlanmak mümkün mü? –

+0

@Sniffer ': yardım desen'i. – mhinz

+0

@mhinz Şu anda Windows çalıştırıyorum ve VIM'im yok ama yine de cevabını biliyorsunuz, bu yüzden iyi. Teşekkürler. –

cevap

14

Açıklama:

\&\| etmek, ve operatör veya operatörüne ne. Böylece, her iki konser de eşleşmeli, ancak sadece son vurgulanacak.

Örnek 1:

(Aşağıdaki testler :setlocal hlsearch varsayalım.)

Bu dize düşünün:

foo foobar 

Şimdi /foo hem deyişle foo vurgulayacaktır. Ancak bazen'u foobar ile eşleştirmek istiyorsunuz. O zaman /foobar\&foo'u kullanmalısınız.

Yine de böyle çalışır. Sık sık kullanılıyor mu? Onu şimdiye kadar birkaç kez görmedim. Çoğu insan bu kadar basit durumlarda sıfır genişlikli atom kullanacaktır. Örneğin. Bu örnekte olduğu gibi /foo\zebar üzerinden yapılabilir.

Örnek 2:

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

\c - görmezden vaka

\v -

(){4} - (> Bu durumda & kaçmak gerekmez) - Aynı düzeninin 4 kez

tekrarlamak "çok sihirli" [^aeiou] - bu karakterleri hariç tutun

\a - alfabetik karakter

Böylece, bu, oldukça kafa karıştırıcı, regexp'in xxxx, XXXX, wXyZ veya WxYz ancak AAAA veya xxx1 eşleşir.Basit terimlerle ifade etme: 'a', 'e', ​​'i', 'o' veya 'u' içermeyen 4 alfabetik karakter dizisini eşleştirin.

+0

Çok güzel bir açıklama. –

+0

@Sniffer Not: tüm durumlarda, concat sıfır genişlikli pozitif bir görünümle değiştirilebilir ('a \ & b \ & c' her zaman' \% (a \) \ @ = \% (b \) \ @ = c “Bunu neden bahsetmediğinizi merak ederek, sadece sıfır genişlikli atomlar hakkında birkaç kelime var). Look-aheads/look-behind'lar daha güçlüdür, daha sonra da daha güçlüdür ve sadece onları kullanmaya alışmak mantıklıdır çünkü yeni regexp motorunu öğrendiğinizde, ne look-aheads'ı ne de concats'ı destekleyeceği veya sadece görünüşü destekleyeceği çok daha muhtemeldir -ahilleri daha sonra konsat için herhangi bir destek var. – ZyX

+0

Ayrıca, sıfır genişlik olarak kullanılan '\ zs 'nin buggy olduğunu unutmayın: arabellekte foo ile'. \ Zso' aramayı deneyin ve sonucu '. \ @<= O' ile karşılaştırın. Gerçi '\ ze' için bir hata bilmiyorum. – ZyX