2013-05-23 26 views
6

Tôi đã đọc các câu hỏi về regex trên trang này nhưng vấn đề của tôi có vẻ hơi khác một chút. Tôi cần phải phù hợp với một số có 2 chữ số, chẳng hạn như 23 đến 75. Tôi đang làm điều này trên một hệ thống Unix của HP-UX. Tôi tìm thấy các ví dụ về 3 - 44 nhưng hoặc bất kỳ số chữ số nào, không có gì được cố định chiều dài, điều này hơi đáng ngạc nhiên, nhưng có lẽ tôi không hiểu câu trả lời ví dụ về độ dài biến.Cụm từ thông dụng - Phạm vi hai chữ số (23-79)?

+6

Bạn có chắc chắn muốn có một regex ở đây không? Nó có vẻ như chuyển đổi sang một loại tích phân theo sau là so sánh số nguyên có thể thích hợp hơn. Đặc biệt là nếu phạm vi có thể thay đổi trong tương lai. – Paulpro

+2

Hãy để tôi thứ hai @ đề xuất của Paulpro - trong khi một regex * có thể * làm điều này, đó là một người nghèo (tôi bị cám dỗ để nói "khủng khiếp") công cụ cho công việc. –

+0

Có gì sai với '23 <= the_number <= 75'? –

Trả lời

7

Vì bạn không cho biết liệu điều này có bổ sung cho bất kỳ ký tự nào khác không (hoặc ở giữa một chuỗi lớn hơn), tôi đã bao gồm logic ở đây để chỉ ra những gì bạn cần để khớp với phần số của chuỗi. Điều này sẽ giúp bạn có được ở đó. Chúng tôi đang tạo một phạm vi cho các số thứ hai mà chúng tôi đang tìm kiếm chỉ cho phép các ký tự đó. Sau đó, chúng tôi đang so sánh nó với các phạm vi khác như một or:

(2[3456789]|[3456][0-9]|7[]) 

Như Oded lưu ý bạn có thể làm điều này cũng kể từ dãy phụ cũng được chấp nhận (phụ thuộc vào việc thực hiện các regex trong ứng dụng mà bạn đang sử dụng):

(2[3-9]|[3-6][0-9]|7[0-5]) 

Dựa vào tiêu đề bạn sẽ thay đổi người cuối cùng từ 5 đến 9 để đi 75-79:

(2[3-9]|[3-6][0-9]|7[0-9]) 

Nếu bạn đang cố gắng để phù hợp với những con số cụ thể như một st vòng (từ đầu đến cuối) thì bạn sẽ sử dụng các công cụ sửa đổi ^$ để chỉ ra phần đầu và cuối của chuỗi.

Có một tài liệu tham khảo kỹ thuật tuyệt vời của Regex dao động ở đây:

http://www.regular-expressions.info/numericranges.html

Nếu bạn đang sử dụng một cái gì đó giống như grep và cố gắng để phù hợp với dòng có chứa số lượng với những nội dung khác thì bạn có thể làm điều gì đó như này cho các phạm vi thru 79:

grep "[^0-9]?(2[3-9]|[3-6][0-9]|7[0-9])[^0-9]?" folder 
+3

Có thể được rút ngắn thành '(2 [3-9] | [3-6] [0-9] | 7 [0-5])' – Oded

+0

Phải. Tôi đã chạy vào trường hợp mà điều này không làm việc trong mọi thực hiện nhưng theo tiêu chuẩn nó nên. –

+1

điều này sẽ trả về true nếu bạn vượt qua 2345 – SolidSnake

0

bạn có hai loại số bạn muốn kết hợp:

  • các chữ số 2, tiếp theo là một trong các chữ số từ 3 đến 9
  • một trong các chữ số từ 3 đến 7, tiếp theo là bất kỳ chữ số

Edit: Vâng, đó là phạm vi của tiêu đề (23-79).Trong câu hỏi của bạn (23-75), bạn có ba:

  • các chữ số 2, tiếp theo là một trong các chữ số từ 3 đến 9
  • một trong các chữ số từ 3 đến 6, tiếp theo là bất kỳ chữ số
  • các chữ số 7, tiếp theo là một trong các chữ số từ 0 đến 5
+0

Hầu như - tối đa '75', không phải là '79'. – Oded

+0

@Oded Các op đã viết 79 trong chủ đề và sau đó 75 trong cơ thể của bài viết. Không rõ anh ta thực sự muốn gì. – Paulpro

+0

Xin lỗi cho lỗi đánh máy trong ví dụ tiêu đề, hai số là ví dụ, điểm chính chỉ là 2 chữ số. Nhưng tôi hiểu ý anh là gì, 79 không phù hợp với toàn bộ phạm vi [3-7] [0-9], 75 thì chính xác hơn ở chỗ tôi không thể luôn lấp đầy toàn bộ phạm vi. Vì vậy, câu trả lời 3 phần là những gì tôi đang tìm kiếm. – user2414817

3

Công cụ này là chính xác những gì bạn cần: Regex_For_Range

Từ 29-79: \b(2[3-9]|[3-7][0-9])\b

Từ 29-75: \b(29|[3-6][0-9]|7[0-5])\b

Và chỉ để cho vui, 192-1742: \b(19[2-9]|[2-9][0-9]{2}|1[0-6][0-9]{2}|17[0-3][0-9]|174[0-2])\b :)

+0

Công cụ này có thông tin đăng nhập ngay bây giờ, bạn có biết chủ sở hữu không? – weston

+0

@weston Quá tệ! Tôi sẽ liên lạc với họ để biết lý do xác thực này và tôi quay lại với bạn. – sp00m

+0

Nếu bạn biết họ, có thể bạn có thể thuyết phục họ mở nguồn. Đăng trên github, hoặc ở đây – weston

-1

này nên làm điều đó:

/^([2][3-9]|[3-6][0-9]|[7][0-5])$/ 

^$ sẽ làm cho nó nghiêm ngặt rằng nó sẽ chỉ khớp với 2 số, vì vậy trong trường hợp bạn có i.e 234 nó sẽ không hoạt động.

+1

Vì vậy, bạn downvoted và sao chép câu trả lời của tôi? Không mát mẻ. –

+1

Ngoài ra, thao tác này sẽ không hoạt động nếu chúng đang sử dụng thứ gì đó như 'grep' để khớp với một dòng có chứa các số mà chúng đang tìm kiếm. –

+1

@ AbsoluteƵERØ - không bạn của tôi, tôi đã không bỏ phiếu cho câu trả lời của bạn. Tôi mất hơn 5 phút để kiểm tra các yêu cầu sau đó đăng nó sau đó tôi JUST đã kiểm tra câu trả lời của bạn. – SolidSnake

1

Nếu tôi muốn 2 chữ số phạm vi 0-63

/^[0-9]|[0-5][0-9]|6[0-3]$/ 
  1. [0-9] sẽ cho phép chữ số duy nhất 0-9
  2. [0-5] [0-9] sẽ cho phép 00-59
  3. 6 [0-3] sẽ cho phép từ 60 đến 63

Bằng cách này bạn có thể mất Regular Expression cho bất kỳ hai chữ số Phạm vi

Các vấn đề liên quan