Regex làm thế nào để phù hợp với một nhân vật tùy chọn


147

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

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

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

Nếu tôi xóa ([A-Z]{1}) +.*? +khỏi regex, nó sẽ khớp với mọi thứ tôi cần ngoại trừ chữ cái nhưng nó khá 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})/

Câu trả lời:


246

Sử dụng

[A-Z]?

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

Bạn có thể cải thiện regex của bạn để

^([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, \dgiố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 bắt giữ riêng biệt không? Và nếu vậy, tại sao bạn không nắm bắt được nhóm chữ số thứ tư đến cuối cùng?


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 với regex. Nếu bạn thấy một cách tốt hơn để viết này, tôi sẽ mở để đề xuất.
jim

1
Tim, ví dụ của bạn hoạt động cho cả hai chuỗi cho dù tôi có một chữ cái ở vị trí đó hay không. Cảm ơn.
jim

26

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

([A-Z]{1}?)

Bộ định lượng {1}là dự phòng để bạn có thể thả nó.


Cảm ơn mật mã. Dấu chấm hỏi có thay thế `+. * Không? + `?
jim

Khi sử dụng grep regex, bạn sẽ gặp lỗi nếu bạn bỏ {1} (grep: lookbehind khẳng định không cố định độ dài). Vì vậy, đó là một trường hợp để cho nó vào.
Zunderscore

6

Bạn cũng 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ộ phần tùy chọn

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

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

0

Bạn cũng có thể sử dụng regex đơn giản hơn được thiết kế cho trường hợp của bạn như (.*)\/(([^\?\n\r])*)nơi $2phù hợp với những gì bạn muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.