2012-01-13 17 views
8

Tamam, şu an çok kalın hissediyorum. Temel olarak, dışında, belirli bir dizgiyi tam olarak ile eşleştirecek bir JavaScript düzenli ifadesi tanımlamak istiyorum. Bu yüzden ben o dizeBelirli bir dize dışında bir şeyle eşleşen bir JavaScript normal ifadesi tanımlama

"dogsled" 

veya dize maç olacak şekilde tek başına normal ifade istediğiniz

"dog" 

veya

"cat" 

dize olduğunu varsayalım

"cattle" 

Sadece "köpek" ya da "kedi" değil kendi. Ben

var pattern= /^(?!dog|cat).+/ 

pattern.test("cat") // false, as expected 
pattern.test("dog") // false, as expected 
pattern.test("bananananana") // true 
pattern.test("dogsled") // false, but the regexp I want would return true 

Bu .... teşekkürler basit olmalı ... temelde diyor ki, tam olarak neye ihtiyacım yok "kedi" ya da "köpek" ile başlayan bir şey yok saymak, bu denedim!

Sadece netleştirmek için Düzen, ben düzenli ifade " "dogsled" veya sahte için "köpek" için sahte ve gerçek dönmelidir want- sonucu elde etmek için dönüş değerlerin herhangi olumsuzlamasıydı yapmak istemiyorum sığır '

+2

+1. Birçok [tag: regex] soru sadece "Ben kod" tarzı vardır. – Matt

+4

Neden sadece olumsuz değil? '! string.match (/^dog | cat $ /)' –

+0

@LinusKleen ha ha ha regex sorusu için mükemmel kullanıcı adı :-) – Pointy

cevap

6

ben Linus Kleen's answer belirtildiği gibi sadece bir maç inkâr tercih olacaktır. Kesinlikle regex hepsini yapmak gerekir Ancak, (ya öğrenme deneyimi ya da bir şey) o zaman şu çalışması gerekir düşünüyorum:

^((dog|cat(?!$)).+|(?!dog|cat).+)$ 

Bu bir değişme ile iki negatif lookaheads kullanır. Birincisi, "cat ya da dog" ile eşleşiyorsa, karakter dizisi karakterinin ($) sonuna kadar takip edilmiyor, ardından başka bir şey ". Bu, dogsled ve cats ile eşleşir ve bu nitelikteki şeyler.

münavebe ikinci yarısı "dizesi (^) başlangıcı dog veya cat (yani bunlardan biriyle başlamaz), sonra bir şey eşleşmesi takip olmadığından emin olun" diyor. Bu, cat veya dog (banana gibi) ile başlamadığınız herhangi bir kelimeyi alır.

Here's an example on regexpal. Regex'i gerçekten vermek için

+0

Mükemmel. Artı iki (eğer yapabilirsem). –

+0

@ eldarerathis- yalnızca regex gereksinimi entegrasyon kısıtlamalarına indirgenmiş ve bu hoş bir şekilde uyuyor! Basit olumsuzluk benim de tercihim olurdu, ama bu işe yarıyor. Teşekkürler! – VLostBoy

0

"için ve gerçek' kedi ben bu hile yapmak gerekir düşünüyorum:

/^(dog|cat)?.+/ 
+0

Yukarıdaki her ikisi de "köpek" ile eşleşiyor ve 'cat'. – eldarerathis

+0

Neredeyse bu tersi davayı karşılıyor ... – VLostBoy

4

Ben tam olarak tüm JavaScript tercüman desteklenmeyen edilecek negatif ileriye bakma iddialarını ((?! ...)) hatırlıyorum. Normal ifadenin sonucu üzerinde basit bir olumsuzluk da yeterli olmalıdır, değil mi?

var pattern = /^cat|dog$/; 

!pattern.test("cat");   // => false 
!pattern.test("dog");   // => false 
!pattern.test("bananananana"); // => true 
!pattern.test("dogsled");  // => true 
+0

Gerçekten mi? JavaScript'in lookbehind'leri desteklemediğini biliyorum, ancak lookaheads ile ilgili herhangi bir problemden haberdar değildim (olumlu ya da olumsuz). – Wiseguy

+0

artı gerçek problemin iyi bir analizi için bir tane – davogotland

İlgili konular