2011-06-10 15 views
10

Sadece düzenli bir ifadeyle yapılabilecek bir çözüm arıyorum. Bu değişkenler, alt dizgiler, vb ile kolay olacağını biliyorum.Normal İfade - arka arkaya 4 basamak, ancak hepsi sıfır olamaz

Ve ben Vim'den bahsetmeme rağmen PCRE stil regex sözdizimi arıyorum.

Dizeleri 4 sayısal hanede tanımlamalıyım ve hepsi 0 olamaz. Aşağıdaki dizelerin bir maç olacağını Yani:

0001 
1000 
1234 
0101 

Ve bu olmaz: Bu eğer bu konularda büyük bir dize içinde bir dizi yerde meydana gelecek bir alt karakter

0000 

; Yapması gerektiğini düşünmüyorum. Örneğin

için
xxxxxxxxxxxx0001xxxxx 
xxxxxxxxxxxx1000xxxxx 
xxxxxxxxxxxx1234xxxxx 
xxxxxxxxxxxx0101xxxxx 
xxxxxxxxxxxx0101xxxxx 
xxxxxxxxxxxx0000xxxxx 
+0

Eğer substr ((substr (8,4) * 1)> 0) ve sonra – Grumpy

+0

rafine soruyu kullanamazsınız - teşekkürler – user210757

+0

oh wow. Olduğun gibi bir şey eklemek üzereydim ve sonra beni bir dakikalığına dövdün. – Earlz

cevap

31
(?<!\d)(?!0000)\d{4}(?!\d) 

ya da daha nazik/maintainably/sanely:

m{ 
    (?<! \d ) # current point cannot follow a digit 
    (?! 0000) # current point must not precede "0000" 
    \d{4}   # match four digits at this point, provided... 
    (?! \d ) # that they are not then followed by another digit 
}x 
+2

Okuyucular için not: Soru, daha uzun bir sayısal dizgenin alt dizelerini hariç tutmak istemiyorsa, bu yanıt yalnızca '(?! 0000) \ d {4}' (veya '(?! 0 {4}) \ olacak d {4} '). – sawa

+0

şimdi nasıl VIM'de bunu nasıl yapacağımı göster! çok sihirli bayrak kabul edilebilir – user210757

3

sadece 4 basamak için maç (\d{4} yapmalısınız) ve ardından maç '0000' eşit değil emin olun.

+0

numaranıza geri dönerek bir komut yazmıyorum - değişken yok - grep kullanıyorum ve vim – user210757

4

PCRE, lookarounds desteklediğinden, \d{4}(?<!0000), dört ardışık sıfır olmayan karakterin herhangi bir örneğini bulacaktır. here numarasına bakınız. Eğer maç sadece dizesinin doğru pozisyonda meydana emin gerekiyorsa

kullanabileceğiniz ^.{X}\d{4}(?<!0000).{Y}$ yerine, X ve Y sırasıyla karakterleri önceki ve sonraki sayıları nerede (sizin örnekte 12 ve 5.)

+0

Genel olarak, lookaheli (tchrist'in cevabında olduğu gibi), lookbehind kullanmaktan daha tercih edilir. – sawa

+0

@sawa - Bu bir performans sorunu mu? – dlras2

+0

Sağ. Performans. Ayrıca, bazı regex motorlarında lookbehind'in sınırlamaları olabilir (hatta hiç uygulanamaz). – sawa

5

ben iyi sen regex answe vermeye karar verdim, burada bazı yanıtlar düzenli ifadeler olmadığını şikayet yana r. Bu daha iyi bir yol muhtemelen var, ilkel, ama nasıl çalışır: 1-9 yalan eşleşen dan 0000 önlenmesi gerekir biri hariç her yerde 0-9 içeren bir şey için

([1-9][0-9][0-9][0-9]|[0-9][1-9][0-9][0-9]|[0-9][0-9][1-9][0-9]|[0-9][0-9][0-9][1-9]) 

Bu denetler. Regex ayrıştırıcınız bu meta karakterleri destekliyorsa, muhtemelen [0-9] yerine daha basit bir şekilde \ d kullanarak yazabilirsiniz.

+0

Teşekkür ederim @Richard, ilkel olabilir ama işe yarıyor :) – Mikel