Regex, isteğe bağlı bir karakterle nasıl eşleşir


147

Şimdiye kadar doğru çalıştığını düşündüğüm bir regex var. İsteğe bağlı bir karakterle eşleşmem gerekiyor. Orada olabilir ya da olmayabilir.

İşte iki dize. Üst dize, alt dize eşleşmez. Alt dizede tek bir harf bulunmaması, onu başarısız kılan şeydir.

Eğer varsa 5 rakamdan sonra tek harfi almak istiyorum ve eğer değilse, dizenin geri kalanını almaya devam edin. Bu mektup olabilir A-Z.

([A-Z]{1}) +.*? +Normal ifadeden kaldırırsam , mektup dışında ihtiyacım olan her şeyle eşleşir, ancak önemli.

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

İşte kullandığım normal ifade.

/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/

Yanıtlar:


247

kullanım

[A-Z]?

mektubu isteğe bağlı yapmak. {1}gereksizdir. (Tabii ki [A-Z]{0,1}aynı anlama gelen bir yazı da yazabilirsiniz , ama bunun ?için var.)

Normal ifadenizi

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})

Ve çoğu regex lehçesinde, \daynıdır [0-9]:

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})

Ancak: 11 ayrı yakalama grubuna gerçekten ihtiyacınız var mı? Ve eğer öyleyse, neden dördüncü ile sonuncu basamak grubunu yakalamıyorsunuz?


Tim, dürüstçe bu normal ifade yazmadım emin değilim. Regex için hala oldukça yeniyim. Bunu yazmanın daha iyi bir yolunu görürseniz, önerilere açığım.
jim

1
Tim, örneğin o konumda bir harfim olsun ya da olmasın her iki dizgede de çalışır. Teşekkürler.
jim

26

Tek harfi ?sonradan ekleyerek isteğe bağlı yapabilirsiniz :

([A-Z]{1}?)

Nicelleştirici {1}gereksizdir, böylece düşürebilirsiniz.


Teşekkürler codeaddict. Soru işareti `+. * 'In yerini alıyor mu? + '?
jim

Grep regex'i kullanırken {1} 'i düşürürseniz bir hata alırsınız (grep: lookbehind iddiası sabit uzunluk değildir). Yani bu onu bırakmak için bir durum.
Zunderscore

6

Tek harfi de isteğe bağlı olarak işaretlemeniz gerekir:

([A-Z]{1})? +.*? +

veya tüm parçayı isteğe bağlı yapın

(([A-Z]{1}) +.*? +)?

1
Stefan, mektubu tamamen isteğe bağlı yapmak istiyorum. Her ikisini de denedim ama yine de hiçbir şeye uymuyor. Eminim yanlış anladım. Örneğinizi dizeye eklemek için değiştirebilir misiniz?
jim

0

Ayrıca sevdiği vaka için tasarlanmış basit regex kullanabilirsiniz (.*)\/(([^\?\n\r])*)nereye $2istediğini maç.

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.