2011-11-18 23 views
10

RegEx ifadelerinde çok kötüyüm ve kullanımları arasındaki sözdizimini hatırlamak için onları yeterince sık kullanmıyorum.Bir dize olduğunda iki kez eşitleme

Dosyalarımı aramak için grepWin kullanıyorum. Verilen bir dize iki kez olan dosyaları döndürecek bir arama yapmam gerekiyor. Ben kelime arama olsaydı

Yani, örneğin, "nasıl", daha sonra bir maç olmaz file:

Merhaba
bugün nasılsın?

ancak dosya iki olur:

Merhaba
bugün nasılsın?

İyiyim, nasılsınız?

Herhangi biri, bir RegEx'in nasıl eşleşeceğini bilen var mı? Böyle

+1

Arama dizgisinin bir değişken olması gerekiyorsa, bu Regex ile mümkün değildir. Bir betik dili ile birleştirmeniz gerekir. Eğer değişken olması gerekmiyorsa, bu regex şöyle yapar: 'nasılsınız. * Nasılsın? – Jeff

+1

@Jeff JavaScript Normal ifadesinde eşleşen bir gruba başvurmak mümkündür:'/(abc) \ 1/'abcabc'yi eşleştiriyor, ancak abc değil. –

+0

Sadece "nasıl" _exactly_ iki kez görünüyorsa eşleşmelidir mi? Ya üç veya daha fazla kez görünürse? – Wiseguy

cevap

13

şey (dil ve belirli bir görev bağlıdır)

\(how.*){2}\ 

Düzenleme: @CodeJockey

\^(([^h]|h[^o]|ho[^w])*how([^h]|h[^o]|ho[^w])*){2,2}$\ 

(daha karmaşık hale) @CodeJockey göre : Teşekkürler yorumlar için

+3

bu iki veya daha fazla kez ile dosyaları alırsınız, ancak üç veya daha fazla olayı olan dosyaları ** hariç tutmuyor –

+0

evet, haklısınız – VMykyt

+1

@CodeJockey Ben de böyle okurum. Askerlerin iki kere _exactly_ ifade edip etmediğini merak ediyordum. – Wiseguy

1

Bu aslında düşündüğümden çok daha zor

(?<!blah.{0,99999})blah(?=.*?blah)(?!.*blah.*blah) 

başarıyla "> Arama Dosya" kullanarak, Eclipse kullanılan iletişim dışlamak için dosyaları: o

... Bu ifadesi ve grepWin desteklemediği değişken uzunlukta olan ileriye dönük gerektirir ediyorum blah'un bir ve üç örneğiyle ve tam olarak iki örneğe sahip dosyaları dahil etmek için blah.

Eclipse, görünümde .*'a izin vermiyor, bu yüzden .{0,99999} yerine kullandım.

Doğru araçla mümkündür, ancak grepWin ile çalışmak için güzel bir şey değildir (yukarıdaki cevaba bakınız). Diğer araçları (Eclipse gibi) kullanabilir ve daha sonra dosyalar ile ne yapmak istersiniz?

+0

Sorun, sadece lookaheads ile yaptım. – Wiseguy

+0

evet - İstenilen ürüne @ VMykyt'in çözümünü test ettiğimde ve çalıştıktan sonra rahatsız olmadım (özellikle OP'den herhangi bir ilgi duymadan). Başlangıçta çalıştığım zaman, beynim, bir şekilde, arka arkaya bakmadan mümkün kılmayı başarabilen başlangıç ​​çizgisi ya da telli çapa fikrini geçici olarak kaybetti: D –

+0

@Wiseguy Çözümünüzün tümüyle kullanılmasını seviyorum yine de olsa ... yine de, eklemek çok zor olmasa da, hiç kimse OP'nin sadece iki örneğe sahip dosyaları eşleştirmek isteyebileceğini, ancak "obüs" veya "nasılsa" ya da hatta "duş" herhangi bir sayıda kez –

4

Ne grepWin'in desteklediğini bilmiyorum, ama bir şeyleri iki kez eşleştirmek için geldiğim şey.

/^((?!how).)*how((?!how).)*how((?!how).)*$/ 

Açıklama:

/^    # start of subject 
    ((?!how).)* # any text that does not contain "how" 
    how   # the word "how" 
    ((?!how).)* # any text that does not contain "how" 
    how   # the word "how" 
    ((?!how).)* # any text that does not contain "how" 
$/    # end of subject 

Bu iki "nasıl" s adlı sağlar, ancak "nasıl" s arasında metinleri ve ya bunların yan "nasıl" içermezler için.

Elbette, ifadede "nasıl" için herhangi bir dizeyi değiştirebilirsiniz. iki kez yalnızca arama ifadesini yazarak "basitleştirmek" istiyorsanız


, böylece geribaşvuruları kullanabilirsiniz:

/^(?:(?!how).)*(how)(?:(?!\1).)*\1(?:(?!\1).)*$/ 

Refiddle with this expression

Açıklama: Ben ?: eklendi
yapmak negatif lookaheads metni yakalama. Ardından, yakalama alt katmanını (ilk ve tek olanı) yapmak için normal how'un etrafına parantezler ekledim.

o ve (herhangi bir içermezolur yakalama "nasıl" anlamında) bir negatif ileri yönlü olduğu için ilk lookahead içinde "nasıl" yeniden dahil etmek zorunda yakalanan o noktada henüz yakalanan değildir "nasıl".