Soru Regex isteğe bağlı bir karakterin eşleşmesi


Şu ana kadar doğru çalıştığını düşündüğüm bir ifadem var. İsteğe bağlı bir karakterle eşleşmem gerekiyor. Orada olabilir veya olmayabilir.

İşte iki ip var. Alt dize değilken üst dize eşleştirilir. Alt dizede tek bir harfin olmaması, başarısızlığa neden olan şeydir.

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

Eğer kaldırırsam ([A-Z]{1}) +.*? + regex'ten, mektup haricinde ihtiyacım olan her şeyle eşleşecek ama önemli.

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

İşte kullanıyorum regex.

/^([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})/

76
2017-10-24 06:34


Menşei




Cevaplar:


kullanım

[A-Z]?

mektubu isteğe bağlı yapmak. {1} gereksizdir. (Tabii ki sen de yazabilirsin [A-Z]{0,1} Aynı anlama gelirdi, ama ? bunun için var.)

Regex'inizi geliştirebilirsiniz

^([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 olduğu için \d aynı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})

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


142
2017-10-24 06:44



Tim, bu regex'i yazmadığımdan emin değilim. Hala regex için oldukça yeni. Bunu yazmanın daha iyi bir yolunu görürseniz, önerilere açığım. - jim
Tim, örneğim her iki dizede de o pozisyonda bir mektubum olsun ya da olmasın. Teşekkürler. - jim


Ekleyerek tek harfi isteğe bağlı yapabilirsiniz. ? bundan sonra:

([A-Z]{1}?)

Niceleyici {1} gereksizdir, böylece bırakabilirsiniz.


13
2017-10-24 06:42



Teşekkür codeaddict. Soru işareti `+. * Yerini alır mı? + '? - jim
Grep regex'i kullanırken, {1} değerini düşürdüğünüzde bir hata alırsınız (grep: lookbehind assertion sabit uzunluk değildir). Yani bu onu bırakmak için bir durum. - Zunderscore


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

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

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

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

4
2017-10-24 06:44



Stefan, mektubu tamamen isteğe bağlı yapmak istiyorum. İkisini de denedim ama hala hiçbir şeyle uyuşmuyor. Eminim yanlış anladım. Örneğini dizeye dahil edecek şekilde değiştirebilir misiniz? - jim