2010-03-08 49 views

Trả lời

472

Bạn có thể sử dụng sau đây regex toàn cầu:

\[(.*?)\] 

Giải thích:

  • \[: [ là một char meta và cần phải được thoát nếu bạn muốn kết hợp nó theo nghĩa đen.
  • (.*?): khớp mọi thứ theo cách không tham lam và chụp.
  • \]: ] là thẻ meta char và cần phải được thoát nếu bạn muốn đối sánh nó theo nghĩa đen.
+6

Phương pháp của câu trả lời khác, sử dụng '[^]]' nhanh hơn không tham lam ('?'), Và cũng làm việc với các hương vị regex không hỗ trợ không tham lam. Tuy nhiên, không tham lam trông đẹp hơn. – Ipsquiggle

+0

@Ipsquiggle bạn là đúng sir :) – StErMi

+92

Làm thế nào để loại trừ '[' ']' từ đầu ra (kết quả)? –

65

này nên làm việc ra ok:

\[([^]]+)\] 
+3

Trong trường hợp sử dụng của tôi, văn bản có khung có thể bao gồm dòng mới và regex này hoạt động, trong khi câu trả lời được chấp nhận thì không. – Dave

+1

Lớp nhân vật [^]] có nghĩa là gì? Nó khớp với cái gì? – Richard

+2

@Richard, The^phủ nhận lớp nhân vật. Nó có nghĩa là "bất kỳ nhân vật nào không phải là một]". – jasonbar

28

thể ngoặc được lồng vào nhau?

Nếu không: \[([^]]+)\] khớp với một mục, kể cả dấu ngoặc vuông. Backreference \1 sẽ chứa mục cần khớp. Nếu hương vị regex của bạn hỗ trợ xem xét kỹ, hãy sử dụng

(?<=\[)[^]]+(?=\]) 

Điều này sẽ chỉ khớp với mục bên trong dấu ngoặc vuông.

+0

Điều này chỉ đánh dấu lần xuất hiện thứ nhất –

+0

@KunalMukherjee: Không, regex có thể khớp với bất kỳ số lần nào. Nhưng một số hương vị regex cần phải được nói một cách rõ ràng để áp dụng regex nhiều lần (ví dụ, bằng cách sử dụng cờ '/ g' trong JavaScript). –

1
([[][a-z \s]+[]]) 

Trên nên làm việc trao Giải thích sau

  • ký tự trong dấu ngoặc vuông [] định nghĩa lớp characte có nghĩa là mô hình phải phù hợp với ít nhất một charcater đề cập trong dấu ngoặc vuông

  • \ s chỉ định một không gian

  • + có nghĩa là ít nhất một của nhân vật được đề cập trước đó đến +.

+0

Trong trường hợp nhạy cảm 'A-Z' nên thêm vào mẫu:' ([[] [a-zA-Z \ s] + []]) '; Tôi nghĩ rằng đó là cách tốt, trong khi '\' trong các mẫu regex định nghĩa trong các chuỗi ký tự ("và") và trộn lẫn người mới bằng cách xử lý dấu gạch chéo ngược trong "hoặc" tập quán! – MohaMad

36
(?<=\[).+?(?=\]) 

sẽ chụp nội dung mà không cần dấu ngoặc

(< = [?) - lookbehind dương tính với [

*.? - kết quả không tham lam cho nội dung

(?=]) - lookahead dương tính với [

EDIT: cho dấu ngoặc lồng nhau regex dưới đây nên làm việc:

(\[(?:\[??[^\[]*?\])) 
+2

@igaurav Tôi đã kiểm tra và nó hoạt động. Nó sẽ không hoạt động tuy nhiên trong các môi trường không hỗ trợ lookbehinds như Javascript. Có lẽ đó là trường hợp của bạn? –

+0

Adam, giải pháp ngoặc đơn lồng nhau của bạn không thành công khi có chuỗi có '.' trong đó ... – patrick

3

Mã này sẽ trích xuất nội dung giữa dấu ngoặc vuông và ngoặc

(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\])) 

(?: non capturing group 
(?<=\().+?(?=\)) positive lookbehind and lookahead to extract the text between parentheses 
| or 
(?<=\[).+?(?=\]) positive lookbehind and lookahead to extract the text between square brackets 
6

(?<=\().*?(?=\)) công trình tốt theo lời giải thích ở trên. Dưới đây là ví dụ về Python:

import re 
str = "Pagination.go('formPagination_bottom',2,'Page',true,'1',null,'2013')" 
re.search('(?<=\().*?(?=\))', str).group() 
"'formPagination_bottom',2,'Page',true,'1',null,'2013'" 
+1

Bạn nên luôn sử dụng định dạng mã cho regexes, bất cứ nơi nào chúng xuất hiện. Nếu regex nằm trong văn bản chứ không phải là một khối mã, bạn có thể sử dụng backticks để định dạng chúng. ([ref] (http://stackoverflow.com/editing-help#comment-formatting)) –

+0

Ngoài ra, câu hỏi là về dấu ngoặc vuông ('[]'), không phải dấu ngoặc đơn. –

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