2013-05-20 24 views
5

Tôi có chuỗi sau mà tôi chỉ cần khớp với bảy tập cuối cùng giữa dấu ngoặc vuông []. Chuỗi trông giống nhưRegex - khớp với tất cả giữa bộ ngoặc vuông thứ hai ([])

này [15211Z: 2012/9/12] ([5.202.900])

Tôi chỉ cần phù hợp với 5.202.900 trong chuỗi chứa giữa ([]), một số lượng tương tự có thể xuất hiện bất cứ nơi nào trong chuỗi nên một cái gì đó như thế này sẽ không hoạt động (\d{7})

tôi cũng thử như sau regex

([[0-9] {1,7}])

nhưng điều này bao gồm [] trong chuỗi?

+0

Bạn đang sử dụng hương vị regex nào? – HamZa

+0

@HamZaDzCyberDeV - Sử dụng regex cùng với PHP – Roland

+4

Sử dụng '(? <= \ [) \ D {7} (? = \])', [Demo] (http://regex101.com/r/lC8kA5). – HamZa

Trả lời

4

Nếu bạn chỉ muốn 7 chữ số, không phải là dấu ngoặc, nhưng muốn chắc chắn rằng các chữ số được bao quanh với dấu ngoặc:

(?<=\[)\d{7}(?=\]) 

FYI: Đây được gọi là một lookahead dươnglookbehind tích cực.

nguồn tốt về chủ đề này: http://www.regular-expressions.info/lookaround.html

+1

lol, bạn lật tất cả mọi thứ, hãy xem bình luận của tôi ở trên ... – HamZa

+0

@HamZa DzCyberDeV: cảm ơn vì đã chỉ ra điều đó! Tôi đã sửa chữa nó ngay bây giờ ... đó là vấn đề khi viết quá nhanh ;-) – ATN

+0

không có vấn đề, ** + 1 **: D – HamZa

0

Bạn có thể cố gắng sử dụng

\[(\d{1,7})\] 
1

Hãy thử phù hợp với \(\[(\d{7})\]\), vì vậy bạn phù hợp với toàn bộ biểu thức chính quy này, sau đó bạn đi nhóm 1, là giữa dấu ngoặc unescaped. Bạn có thể thay thế {7} bằng dấu '*' cho số không hoặc nhiều hơn, + cho 1 hoặc nhiều hơn hoặc phạm vi chính xác như bạn đã hiển thị trong câu hỏi của mình.

+0

Lưu ý rằng điều này phù hợp với nhiều hơn các con số, nhưng nó giúp dễ dàng truy xuất số mà không làm cho cụm từ thông dụng phức tạp một cách không cần thiết (ví dụ: sử dụng nhìn phía trước hoặc nhìn sau). Các nhóm được sử dụng nhiều hơn những nhóm này. –

0

Nếu mô hình đầu tiên trông giống như bạn (không chỉ chữ số), sau đó điều này sẽ làm việc cho bạn trích xuất nhóm các chữ số được bao quanh bởi dấu ngoặc như ([123]):

\(\[(\d+)\]\) 
0

Từ các chi tiết của bạn, trông giống hệt nhau và trông giống như là tốt. Bạn cũng có thể sử dụng số điện thoại này:

(\d{7})\]\)$ 

Vì mẫu bảy chữ số được mong đợi ở cuối dòng, động cơ cần phải hoạt động ít hơn để tìm kết quả phù hợp.

Hy vọng điều đó sẽ hữu ích!

0

Dưới đây là một chuẩn mực (trong Perl, nhưng tôi nghĩ là gần như nhau trong php) mà so sánh cách tiếp cận lookaround và nhóm chụp:

use Benchmark qw(:all); 

my $str = q/[15211Z: 2012-09-12] ([5202900])/; 
my $count = -3; 
cmpthese($count, { 
     'lookaround' => sub { 
      $str =~ /(?<=\[)\d{7}(?=\])/; 
     }, 
     'capture group' => sub { 
      $str =~ /\[(\d{7})\]/; 
     }, 
    }); 

kết quả:

    Rate lookaround capture group 
lookaround 274914/s   --   -70% 
capture group 931043/s   239%   -- 

Như chúng ta có thể thấy, chụp nhanh hơn 3 lần so với cách nhìn.

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