2010-06-18 24 views
6

"Bu hattan önceki tüm metin dahil edilecektir" metninden önce tüm metni bulmak için normal ifadeleri nasıl kullanırım? Benregex kullanmadan önce tüm metni bul

örneğin

This can include deleting, updating, or adding records to your database, which would then be reflex. 

All text before this line will be included 

You can make this a bit more sophisticated by encrypting the random number and then verifying that it is still a number when it is decrypted. Alternatively, you can pass a value and a key instead. 

cevap

9
(.*?)All text before this line will be included 

kullandığınız düzenli özellikle neyi ifade çerçevesi bağlı Aşağıda bazı örnek metni içerdiği sen . satır karakterlerini eşleşebilir belirtmek için bir bayrak eklemek gerekebilir de.

İlk (ve yalnızca) alt grup, eşleşen metni içerecektir. Bunu nasıl elde edeceğiniz, tekrar kullandığınız dile ve düzenli ifade çerçevesine bağlı olacaktır.

"Bu satırdaki tüm metin ..." metnini eklemek isterseniz, tüm eşleşme istediğiniz gibi olur.

+1

Bu eşleme, * "Bu satırdan önceki tüm metinler eklenecektir" metnini içerecektir. Bu, orijinal sorudan isteniyorsa açık değildir, ancak yanıt vermeme durumunda cevabımı görmeme bakın. –

+1

İlk alt grubun eşleşen metni içereceğini ima etmek istedim. Açıklığa kavuşturmak için düzenleyeceğim. – VoteyDisciple

+1

Evet, ama ben, düşüncenin kavramsal olarak istediğim şeye daha yakın olduğunu iddia ediyorum (ve dolayısıyla daha iyi bir seçenek). Elbette, Lookahead her zaman mevcut değil, ama eğer sahip değilseniz muhtemelen tembel eşleme de yoktur ... Bütün bu bilgiyi cevabıma eklemeyi denedim, umarım açık bir şekilde yapılır. –

1

Bu yapmalıyım:

<?php 
$str = "This can include deleting, updating, or adding records to your database, which would then be reflex. 

All text before this line will be included 

You can make this a bit more sophisticated by encrypting the random number and then verifying that it is still a number when it is decrypted. Alternatively, you can pass a value and a key instead."; 

echo preg_filter("/(.*?)All text before this line will be included.*/s","\\1",$str); 
?> 

İade:

This can include deleting, updating, or adding records to your database, which would then be reflex. 
11

bir açıklama ile başlatılıyor ... belirli bir parça kadar eşleştirmek için hızlı yanıtlar

için sonuna kadar atlayabilir metin, ve orada olduğunu teyit ama eşleşme ile dahil değil, (?=regex) notasyonu kullanarak, olumlu bir lookahead kullanabilirsiniz

Bu, "regex" öğesinin bu konumda olduğunu doğrular, ancak yalnızca başlangıç ​​konumuyla eşleşir, içeriğinin değil. (Çoğu miktarı mümkün tüketir düzenli * kıyasla mümkün olan en az miktarda tüketir)

.*?(?=All text before this line will be included) 
. herhangi bir karakter olan

ve *? tembel maç:

Yani, bu bize bir ifade verir. Bununla birlikte, hemen hemen tüm regex tatlarında ., yeni satırı hariç tutacaktır, bu yüzden yeni satırları içerecek şekilde bir bayrağı açıkça kullanmamız gerekir. Kullanılacak bayrak, s, ("Tek satırlı mod" anlamına gelen), bazı tatlarda "DOTALL" modu olarak da anılır olsa da).

Ve bu da dahil olmak üzere çeşitli yöntemlerle uygulanabilir ...

Küresel olarak,/tabanlı regexes için:

/regex/s 

Inline'ın, ifadeler için küresel:

(?s)regex 

Satır içi, yalnızca parantezlenmiş bölüm için geçerlidir:

(?s:reg)ex 

Ve bir işlev argümanı olarak (regex ile hangi dili yaptığınıza bağlı olarak değişir).

(?s).*?(?=All text before this line will be included) 
Ancak


, bazı uyarılar vardır:

Yani, muhtemelen istediğiniz regex şudur Öncelikle

, tüm regex tatlar tembel nicelik desteklemek - Sadece .*'u kullanmanız gerekebilir (ya da "Tüm metinlerse, kesin gereksinimlere bağlı olarak daha karmaşık bir mantık kullanmak mümkündür." önce ... "birden çok kez görünebilir). İkinci olarak, tüm regex tatları lookaheads'i desteklemez, böylece eşleştirmek istediğiniz metni almak için yakalanan grupları kullanmanız gerekir. Bu nedenle

Son olarak, her zaman bu tür yukarıdaki s olarak bayraklar, belirtemez, böylece eşdeğer eşleme almak için ya maç "bir şey veya yeni satır" (.|\n) ya da belki [\s\S] (boşluk değil boşluk) gerekebilir.

([\s\S]*)All text before this line will be included 

Sonra maç sonucundan ilk alt grubu olarak ayıkla: tüm bu (I XML uygulama olduğunu düşünüyorum) tarafından sınırlama varsa

, o zaman yapmanız gerekecek.

+0

Ah, teşekkürler, bu bilmek faydalı! – vimist

+0

çok kötü, OP asla bir cevabı kabul etmedi. hepsi bana çok yardımcı oldu. – helgatheviking

İlgili konular