İlk maçta durmak için düzenli ifade


531

Normal ifadelerim gibi görünüyor

<xxxx location="file path/level1/level2" xxxx some="xxx">

Sadece konuma atanan alıntılarla ilgileniyorum. Açgözlü anahtar olmadan aşağıdaki kadar kolay olmamalı mı?

/.*location="(.*)".*/

Çalışmıyor gibi görünüyor.


Kaynağınız nedir, HTML mi, xml mi?
Oskar Kjellin

20
Bu neden bir topluluk wiki'si? Bu gerçek bir soru. Artık çok geç.
Ahmad Mageed

1
Hangi dilde yazıyorsunuz? Lütfen XML için normal ifade kullanmayın. XML'i ayrıştırmanın çok daha iyi yolları var
Oskar Kjellin

3
İstediğiniz tek şey basit nitelikleri taramaksa değil. Normal ifade uygun ve daha hızlıdır.
codenheim

Örneğin kod c # eğer bu için linq kullanmak çok daha iyi olduğunu söyleyebilirim. İyi bir ayrıştırıcınız varsa normal ifadenin daha iyi olacağından şüpheliyim
Oskar Kjellin

Yanıtlar:


1096

Normal ifadenizi açgözlü yapmamanız gerekir, çünkü varsayılan olarak "(.*)"tümüyle eşleşir "file path/level1/level2" xxx some="xxx".

Bunun yerine, nokta yıldızınızı açgözlü olmayan hale getirebilirsiniz, bu da mümkün olduğunca az karakterle eşleşmesini sağlar:

/location="(.*?)"/

Bir ekleme ?, bir nicelik (açık ?, *ya da +) dışı hırslı yapar.


32
FWIW, farklı biraz olmasını VIM kullanarak, bu regex ihtiyaçlarını örtmek: yerine .*?öyle .\{-}olmayan bir açgözlü maç için.
SooDesuNe

44
Teşekkürler Daniel. "Bir niceleyiciye (?, * Veya +)? Eklenmesi onu açgözlü yapmaz." benim için yararlı bir ipucu.
PhatHV

10
? bunu anlamaya çalışırken kafa karışıklığımı anlatıyor. Ne kadar uygun.
Robbie Smith

1
'Açgözlü' yerine 'tembel' diyebileceğinize inanıyorum
Manticore

50

location="(.*)"açgözlü olmayan sürece sonra "sonra location=kadar " sonra eşleşecektir some="xxx. Yani ya .*?(yani açgözlü olmayan) ya da daha iyi yerine ihtiyacınız .*var [^"]*.


3
[^ "] * aynı zamanda çoğu normal ifade motorunda da daha hızlıdır çünkü mevcut modelden sonra paterni aramasına gerek yoktur
Jean Vincent

1
@Kip: Muhtemelen haklısın, ama .*?gösterim daha genel[^"]*
Bondax

[^ "] *
Frohlich

hayır, eğer burada ^ ve [] ne anlama geldiğini bilmiyorsanız. Çoğu insan anlayacak. *
Vincent Gerris

31

Peki ya

.*location="([^"]*)".*

Bu,. * İle sınırsız aramayı önler ve ilk alıntıyla tam olarak eşleşir.


Grep'teki tutarsızlıklar nedeniyle, taşınabilirliğin bir endişe olması durumunda yukarıdaki tercih edilen model olmalıdır.
Josh Habdas

22

Motorunuz destekliyorsa, açgözlü olmayan eşleme kullanın. Ekle ? yakalama içinde.

/location="(.*?)"/

11

?Global bayrağı olmayan Tembel nicelik belirteçlerin kullanımı cevaptır.

Örneğin,

resim açıklamasını buraya girin

Eğer küresel bir bayrakınız /golsaydı, en düşük uzunluktaki tüm eşleşmeleri aşağıdaki gibi eşleştirecekti. resim açıklamasını buraya girin


1

Kullandığınız Çünkü sayısallaştırılmış alt modelin içinde tarif olarak ve Perl Doc ,

Varsayılan olarak, sayısallaştırılmış bir alt desen " açgözlü " dür , yani desenin geri kalanının eşleşmesine izin verirken mümkün olduğunca çok kez (belirli bir başlangıç ​​konumu verildiğinde) eşleşir. Eğer isterseniz kez az sayıda maç için mümkün, nicelik izleyin ile bir "?" . Anlamların değişmediğine dikkat edin, sadece "açgözlülük":

*?        //Match 0 or more times, not greedily (minimum matches)
+?        //Match 1 or more times, not greedily

Böylece, ölçülen deseninizin minimum eşleşme yapmasına izin vermek için , aşağıdakileri takip edin ?:

/location="(.*?)"/

1

İşte başka bir yol.

İşte istediğin bu. Bu tembel[\s\S]*?

İlk öğe: [\s\S]*?(?:location="[^"]*")[\s\S]* Şununla değiştir:$1

Açıklama : https://regex101.com/r/ZcqcUm/2


Bütünlük için, bu sonuncuyu alır. Bu açgözlü[\s\S]*

Son öğe:[\s\S]*(?:location="([^"]*)")[\s\S]* Şununla değiştir:$1

Açıklama : https://regex101.com/r/LXSPDp/3


Bu iki normal ifade arasında sadece 1 fark vardır ve ?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.