Regex để khớp một chữ số hai hoặc bốn lần


95

Đó là một câu hỏi đơn giản về cụm từ thông dụng, nhưng tôi không tìm ra câu trả lời.

Tôi muốn xác định xem một số xuất hiện theo thứ tự chính xác hai hoặc bốn lần. Tôi có thể sử dụng cú pháp nào?

\d{what goes here?}

Tôi đã thử \d{2,4}, nhưng biểu thức này cũng chấp nhận ba chữ số.


Ví dụ, để phù hợp với một hai hoặc bốn chữ số năm .
DavidRR

Bạn muốn điều gì xảy ra với chuỗi if abc 123 xyz? Nó có nên khớp 12vì đó chính xác là hai chữ số theo thứ tự? Hay không nên, bởi vì 12nó là một phần của dãy chữ số lớn hơn 123mà bản thân nó không dài 2 hay 4? Nếu tôi phải đoán, tôi nghĩ bạn muốn hành vi thứ hai, nhưng câu hỏi của bạn không rõ ràng. Ví dụ và / hoặc một thông số kỹ thuật rõ ràng hơn sẽ hữu ích. Câu hỏi tương tự cho abc 12345 def... điều gì sẽ xảy ra ở đó?
Jean-François Corbett

Câu trả lời:


144

Không có cú pháp cụ thể cho điều đó, nhưng có rất nhiều cách để làm điều đó:

(?:\d{4}|\d{2})    <-- alternation: four digits or two
\d{2}(?:\d{2})?    <-- two digits, and optionally two more
(?:\d{2}){1,2}     <-- two digits, times one or two

1
Cá nhân tôi, chỉ nghĩ đến \d{2}(?:\d{2})?giải pháp ngay lập tức - rất nhiều loại trong số này - đặc biệt là giải pháp cuối cùng, có vẻ rất đẹp và có thể mở rộng.
Nightfirecat

3
+1 vì lưu ý thứ tự cần thiết khi sử dụng thay thế để khớp 4 chữ số đầu tiên, sau đó đến 2 chữ số. Cũng làm tốt việc cung cấp các biến thể khác.
Ahmad Mageed

9
Đối với bất kỳ ai, như tôi, không hiểu việc sử dụng (?:điều này bắt đầu một "nhóm không nắm bắt" (một nhóm không được dùng để tham chiếu trong một câu lệnh thay thế). Bạn cũng có thể chỉ sử dụng parens nhưng chúng sẽ tạo ra một nhóm chụp. Thông tin chi tiết ở đây: stackoverflow.com/questions/3512471/non-capturing-group
Jeremy Moritz

Những điều này sẽ hiển thị cùng một kết quả cho "333" và "33"
Dan

1
@Dan: Những regex này không khớp với chuỗi hoàn chỉnh "333". Bạn có thể đang sử dụng chức năng "tìm chuỗi con phù hợp" của thư viện regex do nhầm lẫn, thay vì chức năng "kiểm tra xem chuỗi hoàn chỉnh có khớp không". Bạn nên tham khảo tài liệu của nó.
ruakh

3
(?<!\d)(\d{2}|\d{4})(?!\d)

Đây là cách chính xác để làm điều đó. Câu trả lời được chấp nhận là sai.

Nó sẽ khớp với 3 chữ số (hoặc 5). Vì vậy, đó là sai trong mắt tôi .

1) Kiểm tra không có chữ số nào trước dãy 2 hoặc 4 chữ số hoặc sau dãy hai hoặc 4 chữ số.

  • (<!) cú pháp là cái nhìn tiêu cực

  • (?!) cú pháp là trang đầu phủ định.

Ở trên sẽ làm việc cho chuỗi giữa:

Nếu chuỗi tìm kiếm của bạn không có nội dung xung quanh nó, bạn có thể sử dụng ^$bắt đầu và kết thúc của neo chuỗi:

^\d{4}$|^\d{2}$

1
Tôi sẽ không nói rằng câu trả lời được chấp nhận là sai. Tôi sẽ nói rằng câu hỏi không rõ ràng, và câu trả lời đó đề cập đến một cách giải thích hợp lệ về nó. Câu trả lời của bạn đề cập đến một cách giải thích hợp lệ khác (mà tôi tình cờ nghĩ là một cách diễn giải có nhiều khả năng hơn - nhưng dường như người hỏi đã không ...).
Jean-François Corbett

2
"Nó sẽ khớp với 3 chữ số" không hoàn toàn chính xác. Tôi nghĩ ý bạn là "Nó sẽ khớp với dãy con 2 chữ số của dãy 3 chữ số."
Jean-François Corbett

1
Ngoài ra, câu trả lời của bạn không hoàn toàn hoạt động như dự định trên các chuỗi gồm 5 chữ số trở lên . Tôi không phải là chuyên gia regex, nhưng tôi đoán một cách để khắc phục nó là làm cho cái nhìn đầu / phía sau phủ định áp dụng cho cả hai trường hợp (chuỗi 2 và 4 chữ số):(?<!\d)(\d{2}|\d{4})(?!\d)
Jean-François Corbett

Tôi nghĩ rằng bạn là chính xác về 5 chữ số. Cảm ơn vì sự chỉnh sửa đó. Sẽ khắc phục điều đó.
JGFMK

^\d{4}$|^\d{2}$sẽ là một cách tiềm năng để khắc phục điều đó. Như sẽ^\d{2}(?!\d)|^\d{4}(?!\d)
JGFMK
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.