İ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.