Normal ifade: bir karakterin ilk oluşumuyla eşleşen


358

Belirli bir karakterin ilk oluşumuna kadar her şeyle eşleşen bir desen arıyorum , ";" - noktalı virgül .

Bunu ben yazdım:

/^(.*);/

Ama aslında noktalı virgülün son oluşumuna kadar her şeyi (noktalı virgül dahil) eşleştirir.


65
/^(.*?);/Ayrıca ( açgözlü olmayan denir ) çalışmalıdır, ancak verilen cevaplar [^;]*daha iyidir.
Pascal

noktalı virgülden sonra değil noktalı virgülden sonra her şeyi nasıl seçersiniz?
Muhammed Umer

bakın bu işe yarıyor \w+(?!([^]+;)|;)ama neden böyle değil? .+(?!([^]+;)|;)
Muhammed Umer

1
Pascal, bunu bir cevap olarak yazmalıydın!
Sean Kendle

@Pascal Bu cevap olarak uygundur! Teşekkürler!
neverMind9

Yanıtlar:


503

İhtiyacın var

/[^;]*/

[^;]Bir olan karakter sınıfı , her şeyi ama noktalı virgül ile eşleşir.

perlreSayfadan alıntı yapmak için :

[] İçine, listedeki herhangi bir karakterle eşleşen karakterlerin bir listesini ekleyerek bir karakter sınıfı belirleyebilirsiniz. "[" İşaretinden sonraki ilk karakter "^" ise, sınıf listede olmayan herhangi bir karakterle eşleşir.

Bu, çoğu normal ifade lehçelerinde çalışmalıdır.


Bu çözümle ilgili en önemli kısım, hattın sonuna da uymasıdır, örneğin benim durumumda foo=bar;baz=bax;bab=bafve eşleştiğimde bab=bafbile ;tam olarak ihtiyacım olan şey yok . Spesifikasyonlar hedef sembolü dışında her şeye uyuyorsa neden işe yaradığından emin değilim ...
skryvets


38

/^[^;]*/

[^;] İfadesi noktalı virgül dışında herhangi bir şeyle eşleşiyor diyor. Köşeli parantezler bir set eşleştirme operatörüdür, bu karakter kümesindeki herhangi bir karakterle eşleşir ^, başlangıçta ters bir eşleşme yapar, bu nedenle bu sette olmayan herhangi bir şeyle eşleştirin .


3
Bu yanıttaki ilk ^ ifadesinin normal ifadeye tamamen farklı bir anlam verdiğini unutmayın: Normal ifadeyi yalnızca dizenin başından başlayarak eşleşmeler için gösterir. Bu durumda, o etkili bir no-op olacağını eğer yalnızca bir kez düzenli ifadeyi çalıştırın. Tek bir dize içinde birden fazla eşleşme aramak istiyorsanız, ilk ^ gitmek gerekir.
Dan Breslau

4
Noktalı virgülün ilk oluşumuna kadar her şeyi eşleştirmek istediğini söyledi, bu yüzden dizenin başlangıcından kastedildiğini varsaydım.
Glenn Slaven



8

örnek yazı:

"this is a test sentence; to prove this regex; that is g;iven below"

Örneğin yukarıdaki örnek metnimiz /(.*?\;)/varsa , normal ifade , noktalı virgül ;de dahil olmak üzere, noktalı virgülün ( ) ilk oluşumuna kadar her şeyi size verecektir :"this is a test sentence;"


3
;char karakter kaçmak gerekli değildir regex özel karakter değildir. Gruplama ()da gerekli değildir. /.*?;/
İle

1
evet, oldukça haklısın. kaçan "üzgünüm daha iyi güvenli" gibi daha fazla oldu
poncius

2
Aradığım cevap buydu. Böylece ? ilk karşılaşmada maçı bitirir mi? Normal ifadenin ... (diyelim) özelliğinin adı nedir?
Parziphal

1
@Parziphal ?karakteri maçı tembelleştirir (mümkün olduğunca az kez eşleşir ). İlk noktalı virgülün sonuna kadar regex eşleşen karakterleri düşünün, o zaman daha fazla gitmiyor çünkü
vazgeçiyor

6

Öznitelikler de dahil olmak üzere bir xml etiketindeki tüm karakterleri nasıl eşleştirmeye çalıştığım için bu benim için çok yararlı oldu. Ben "sonuna kadar her şeyi eşleşir" sorununa koşuyordu:

/<simpleChoice.*>/

ancak sorunu şu şekilde çözebildi:

/<simpleChoice[^>]*>/

bu yazıyı okuduktan sonra. Hepinize teşekkürler.


1
Makine biçimi nedeniyle normal olarak ayrıştırmanın (her dil veya çerçevenin kendi sınıfları vardır) çok daha verimli olduğunu bulmuştum.
Leon Fedotov

1
Güzel. Ben <!DOCTYPE>etiketi sözdizimi hataları ile xml belgeleri düzeltmek için kullandım . Ayrıştırıcı bunun üstesinden gelemediğinden.
Martin Schneider

5

Bu bir normal ifade çözümü değil, sorun açıklamanız için yeterince basit bir şeydir. Dizenizi bölün ve dizinizdeki ilk öğeyi alın.

$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];

çıktı

$ php test.php
match everything until first

5

Bu, yalnızca her bir dizedeki ilk oluşumla eşleşir ve sonraki oluşumları yoksayar.

/^([^;]*);*/

3

"/^([^\/]*)\/$/" benim için çalıştı, gibi bir diziden sadece üst "klasörler" almak için:

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this

2

Gerçekten kimsenin sana doğru cevabı vermediği için üzgünüm ....

Normal ifade ile,? açgözlü olmayan yapar. Varsayılan olarak normal ifade olabildiğince eşleşir (açgözlü)

Basitçe bir? ve açgözlü olmayacak ve mümkün olduğunca az eşleşecek!

İyi şanslar, umarım yardımcı olur.


3
Bu büyük ölçüde gerçek regex uygulamasına bağlıdır ve her uygulamanın açgözlü olmayan modu yoktur.
karatedog

0

onu buldum

/^[^,]*,/

iyi çalışıyor.

"," buradaki "sınırlayıcı".

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.