Câu hỏi Regex cách khớp một ký tự tùy chọn


Tôi có một regex mà tôi nghĩ rằng đã làm việc một cách chính xác cho đến bây giờ. Tôi cần phải khớp với một nhân vật tùy chọn. Nó có thể ở đó hoặc nó có thể không.

Đây là hai chuỗi. Chuỗi trên cùng được khớp trong khi giá trị thấp hơn không phải là. Sự vắng mặt của một chữ cái duy nhất trong chuỗi thấp hơn là những gì làm cho nó thất bại.

Tôi muốn nhận được một chữ cái duy nhất sau 5 chữ số bắt đầu nếu nó ở đó và nếu không, hãy tiếp tục nhận phần còn lại của chuỗi. Thư này có thể là A-Z.

Nếu tôi xóa ([A-Z]{1}) +.*? + từ regex, nó sẽ phù hợp với mọi thứ tôi cần ngoại trừ lá thư nhưng nó quan trọng.

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

Đây là regex tôi đang sử dụng.

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


gốc




Các câu trả lời:


Sử dụng

[A-Z]?

để làm cho lá thư tùy chọn. {1} là thừa. (Tất nhiên bạn cũng có thể viết [A-Z]{0,1} điều đó có nghĩa là giống nhau, nhưng đó là những gì ? có sẵn cho.)

Bạn có thể cải thiện regex của mình

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

Và, vì trong hầu hết các phương ngữ regex, \d giống như [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})

Nhưng: bạn có thực sự cần 11 nhóm chụp riêng biệt không? Và nếu vậy, tại sao bạn không nắm bắt nhóm chữ số thứ tư đến cuối cùng?


142
2017-10-24 06:44



Tim, tôi thực sự không chắc chắn vì tôi không viết regex này. Tôi vẫn còn khá mới để regex. Nếu bạn thấy cách viết tốt hơn, tôi mở lời đề xuất. - jim
Tim, ví dụ của bạn làm việc cho cả hai chuỗi cho dù tôi có một lá thư ở vị trí đó hay không. Cảm ơn. - jim


Bạn có thể tạo một chữ cái tùy chọn bằng cách thêm ? sau đó như sau:

([A-Z]{1}?)

Trình định lượng {1} là dư thừa để bạn có thể thả nó.


13
2017-10-24 06:42



Cảm ơn codeaddict. Dấu chấm hỏi có thay thế `+. * Không? + `? - jim
Khi sử dụng grep regex bạn sẽ nhận được một lỗi nếu bạn thả {1} (grep: lookbehind assertion không cố định chiều dài). Vì vậy, đó là một trường hợp để lại nó trong. - Zunderscore


Bạn phải đánh dấu một chữ cái là tùy chọn:

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

hoặc làm cho toàn bộ một phần tùy chọn

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

4
2017-10-24 06:44



Stefan, tôi muốn làm lá thư hoàn toàn không bắt buộc. Tôi đã thử cả hai nhưng nó vẫn không khớp. Tôi chắc chắn rằng tôi đã sai. Bạn có thể sửa đổi ví dụ của bạn để đưa nó vào chuỗi không? - jim