Pertanyaan Regex cara mencocokkan karakter opsional


Saya memiliki regex yang menurut saya berfungsi dengan benar sampai sekarang. Saya harus mencocokkan pada karakter opsional. Mungkin ada atau tidak.

Di sini ada dua senar. Senar atas cocok sementara yang lebih rendah tidak. Ketiadaan satu huruf di string bawah adalah apa yang membuatnya gagal.

Saya ingin mendapatkan satu huruf setelah 5 digit awal jika ada dan jika tidak, lanjutkan mendapatkan sisa string. Surat ini bisa A-Z.

Jika saya menghapus ([A-Z]{1}) +.*? + dari regex, itu akan cocok dengan semua yang saya butuhkan kecuali surat itu tapi itu penting.

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

Ini adalah regex yang saya gunakan.

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


asal


Jawaban:


Menggunakan

[A-Z]?

untuk membuat surat itu opsional. {1} redundan. (Tentu saja Anda juga bisa menulis [A-Z]{0,1} yang berarti sama, tapi itulah yang ? ada untuk.)

Anda dapat meningkatkan regex Anda

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

Dan, sejak sebagian besar dialek regex, \d sama dengan [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})

Tapi: apakah Anda benar-benar membutuhkan 11 kelompok penangkap terpisah? Dan jika demikian, mengapa Anda tidak menangkap kelompok digit keempat-ke-terakhir?


142
2017-10-24 06:44



Anda dapat membuat satu huruf opsional dengan menambahkan ? setelah itu sebagai:

([A-Z]{1}?)

Kuantifikasi {1} redundan sehingga Anda bisa menjatuhkannya.


13
2017-10-24 06:42



Anda harus menandai satu huruf sebagai opsional juga:

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

atau menjadikan seluruh bagian opsional

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

4
2017-10-24 06:44