Yanıtlar:
İleriye dönük bir iddia kullanabilirsiniz:
(?!999)\d{3}
Bu örnek, dışında üç rakamla eşleşir 999
.
Ancak bu özellik ile düzenli bir ifade uygulamanız yoksa (bkz . Düzenli İfade Lezzetlerinin Karşılaştırılması ), muhtemelen temel özelliklerle kendi başınıza düzenli bir ifade oluşturmanız gerekir.
Yalnızca temel sözdizimi içeren uyumlu bir normal ifade şöyle olur:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
Bu, aynı olmayan üç basamak dizisiyle de eşleşir 999
.
Bir dizede A kelimesini eşleştirmek ve B kelimesiyle eşleşmesini istemiyorsanız Örneğin: Bir metniniz varsa:
1. I have a two pets - dog and a cat
2. I have a pet - dog
Bir evcil hayvan için bir köpeği olan ve kedi olmayan bir metin satırı aramak istiyorsanız, bu normal ifadeyi kullanabilirsiniz:
^(?=.*?\bdog\b)((?!cat).)*$
Sadece ikinci satırı bulacaktır:
2. I have a pet - dog
findstr
komutunu kullanıyor . Bir normal ifade aracında bulmayı beklediğiniz yeteneklerin yalnızca küçük bir alt kümesini sağlar; ileriye bakmak onların arasında değil. (Sadece findstr etiketini kendim ekledim .)
Kalıpla eşleştirin ve maçın mantıksal sonucunu tersine çevirmek için ana bilgisayar dilini kullanın. Bu çok daha okunaklı ve bakımı kolay olacaktır.
not değil, bu antik sorunun dirilişi, çünkü bahsedilmeyen basit bir çözümü vardı. ( Normal ifade ödül arayışı için biraz araştırma yaparken sorunuzu buldunuz .)
Bir (A ve ~ B) düzeniyle eşleşmem gereken bir durumla karşı karşıyayım.
Bunun için temel regex korkutucu derecede basittir: B|(A)
Genel maçları görmezden gelir ve A içerecek olan Grup 1 yakalamalarını incelersiniz.
Bir örnek (regex'te html'yi ayrıştırmayla ilgili tüm feragatnamelerle): A rakamdır, B içindeki rakamlardır <a tag
Normal ifade: <a.*?<\/a>|(\d+)
Demo (sağ alt bölmedeki Grup 1'e bakın)
Referans
\d
olan [[:digit:]]
. İlk referans Perl ve PHP'ye özgü olduğunu belirtiyor: "Perl ve PHP'ye özgü sözdizimini kullanan ve bunu gerçekleştiren bir varyasyon var."
Normal bir dilin tamamlayıcısı da normal bir dildir, ancak onu oluşturmak için normal dil için DFA'yı oluşturmanız ve herhangi bir geçerli durum hatasını bir hataya dönüştürmeniz gerekir. Bkz bu bir örnek. Hangi sayfa demiyor o dönüştürülen olmasıdır /(ac|bd)/
içine /(a[^c]?|b[^d]?|[^ab])/
. Bir DFA'dan normal bir ifadeye dönüşme önemsiz değildir. Normal ifadeyi değişmeden kullanabilmeniz ve daha önce önerildiği gibi koddaki anlambilimi değiştirebilmeniz daha kolaydır.
replace
str.replace(/re/g, '')
, o zaman onlara tekrar katılmaya gerek yok. ayrıca güzel bir sondaki \ s atmak eğer? o str.replace(/\re\s?/g, '')
zamanki gibi , bir ipin ortasında değiştirilen bir şeyden alacağınız yinelenen boşluklardan kurtulursunuz
Buradaki cevabım sorununuzu da çözebilir:
https://stackoverflow.com/a/27967674/543814
$1
okursunuz $2
.$2
, kaçınılmaz olarak orada yakalama yapılmadı.Misal:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
İlk yakalama grubu, kaçınmak istediğiniz deseni belirtir. Son yakalama grubu diğer her şeyi yakalar. Sadece bu grubu oku $2
,.
findstr
Buradaki tüm yanıtlar etiket için geçerli olmadığından etiketi kaldırdım .