Biểu thức chính quy để trích xuất văn bản giữa các dấu ngoặc vuông


411

Câu hỏi regex đơn giản. Tôi có một chuỗi trên định dạng sau:

this is a [sample] string with [some] special words. [another one]

Biểu thức chính quy để trích xuất các từ trong ngoặc vuông, nghĩa là gì.

sample
some
another one

Lưu ý: Trong trường hợp sử dụng của tôi, dấu ngoặc không thể được lồng.

Câu trả lời:


766

Bạn có thể sử dụng regex sau trên toàn cầu :

\[(.*?)\]

Giải trình:

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

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

184
Làm thế nào để loại trừ [ ]khỏi đầu ra (kết quả)?
Mickey Tin

9
@MickeyTin, nếu bạn đang sử dụng Java, bạn có thể nhóm nó bằng cách sử dụng nhóm (1) thay vì nhóm (), vì vậy '[]' sẽ không đi cùng nhau
abyteneverlie

21
Điều này chỉ phù hợp với lần xuất hiện đầu tiên
hfatahi

9
Làm thế nào để bạn loại trừ dấu ngoặc từ lợi nhuận?
jzadra

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

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

  • (?<=\[) - cái nhìn tích cực cho [

  • .*? - không phù hợp với nội dung

  • (?=\]) - cái nhìn tích cực cho ]

EDIT: đối với dấu ngoặc lồng, biểu thức chính quy bên dưới sẽ hoạt động:

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

3
@igaurav Tôi đã kiểm tra nó và nó hoạt động. Tuy nhiên, nó sẽ không hoạt động trong các môi trường không hỗ trợ giao diện như Javascript. Có lẽ đó là trường hợp của bạn?
Adam Moszczyński

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

89

Điều này sẽ làm việc ok:

\[([^]]+)\]

5
Trong trường hợp sử dụng của tôi, văn bản được đặt trong ngoặc đơn có thể bao gồm các dòng mới và biểu thức chính quy 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 [^]] nghĩa là gì? Nó phù hợp với cái gì?
Richard

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

8
Tôi nghĩ rằng nó không hoạt động như mong đợi, bạn nên sử dụng \[([^\[\]]*)\]để có được nội dung trong khung bên trong nhất. Nếu bạn nhìn vào lfjlksd [ded[ee]22]thì \[([^]]+)\]sẽ có được bạn [ded[ee]trong khi biểu thức được đề xuất sẽ trở lại [ee]. testede trong liên kết
TMC

1
Bạn có thể vui lòng cung cấp các ví dụ 'sed' và 'awk' để sử dụng regex này và trích xuất văn bản không. Cảm ơn.
valentt

32

Dấu ngoặc có thể được lồng nhau không?

Nếu không: \[([^]]+)\]khớp với một mục, bao gồm dấu ngoặc vuông. Backreference \1sẽ chứa các mục để được khớp. Nếu hương vị regex của bạn hỗ trợ nhìn, hãy sử dụng

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

Điều này sẽ chỉ phù hợp với các mục trong ngoặc.


@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 được nói rõ ràng để áp dụng regex nhiều lần (ví dụ: bằng cách sử dụng /gcờ trong JavaScript).
Tim Pietzcker

14

Nếu bạn không muốn bao gồm dấu ngoặc trong trận đấu, thì đây là biểu thức chính quy: (?<=\[).*?(?=\])

Hãy phá vỡ nó

Các .trận đấu phù hợp với bất kỳ nhân vật nào ngoại trừ các đầu cuối dòng. Đây ?=là một cái nhìn tích cực . Một cái nhìn tích cực tìm thấy một chuỗi khi một chuỗi nhất định đến sau nó. Đây ?<=là một cái nhìn tích cực . Một cái nhìn tích cực tìm thấy một chuỗi khi một chuỗi nhất định trước nó. Để trích dẫn điều này ,

Nhìn về phía trước tích cực (? =)

Tìm biểu thức A trong đó biểu thức B theo sau:

A(?=B)

Nhìn phía sau tích cực (? <=)

Tìm biểu thức A trong đó biểu thức B có trước:

(?<=B)A

Thay thế

Nếu công cụ regex của bạn không hỗ trợ lookahead và lookbehinds, thì bạn có thể sử dụng regex \[(.*?)\]để chụp các phần bên trong của ngoặc trong một nhóm và sau đó bạn có thể thao tác nhóm khi cần thiết.

Regex này hoạt động như thế nào?

Các dấu ngoặc đơn bắt các ký tự trong một nhóm. Nhận .*?được tất cả các ký tự giữa các dấu ngoặc (trừ dấu chấm dứt dòng, trừ khi bạn sbật cờ) theo cách không tham lam.


12

(?<=\[).*?(?=\])hoạt động tốt theo giải thích được đưa ra ở trên. Đây là một 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 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 khối mã, bạn có thể sử dụng backticks để định dạng chúng. ( ref )
Alan Moore

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

6

Chỉ trong trường hợp, bạn có thể có dấu ngoặc không cân bằng , bạn có thể thiết kế một số biểu thức với đệ quy tương tự như,

\[(([^\]\[]+)|(?R))*+\]

tất nhiên, nó sẽ liên quan đến ngôn ngữ hoặc công cụ RegEx mà bạn có thể đang sử dụng.

Bản giới thiệu RegEx 1


Ngoài ra,

\[([^\]\[\r\n]*)\]

Bản giới thiệu RegEx 2

hoặc là,

(?<=\[)[^\]\[\r\n]*(?=\])

RegEx Demo 3

là những lựa chọn tốt để khám phá.


Nếu bạn muốn đơn giản hóa / sửa đổi / khám phá biểu thức, nó sẽ được giải thích trên bảng trên cùng bên phải của regex101.com . Nếu bạn muốn, bạn cũng có thể xem trong liên kết này , cách nó phù hợp với một số đầu vào mẫu.


Mạch RegEx

jex.im hình dung các biểu thức thông thường:

nhập mô tả hình ảnh ở đây

Kiểm tra

const regex = /\[([^\]\[\r\n]*)\]/gm;
const str = `This is a [sample] string with [some] special words. [another one]
This is a [sample string with [some special words. [another one
This is a [sample[sample]] string with [[some][some]] special words. [[another one]]`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Nguồn

Biểu thức chính quy để khớp với dấu ngoặc đơn cân bằng


4

Nếu bạn muốn fillter chỉ chữ cái bảng chữ cái nhỏ giữa dấu ngoặc vuông az

(\[[a-z]*\])

nếu bạn muốn chữ nhỏ và chữ a-zA-Z

(\[[a-zA-Z]*\]) 

nếu bạn muốn chữ hoa nhỏ và chữ số a-zA-Z0-9

(\[[a-zA-Z0-9]*\]) 

nếu bạn muốn mọi thứ giữa khung vuông

nếu bạn muốn văn bản, số và ký hiệu

(\[.*\])

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

Trên đây nên làm việc đưa ra lời giải thích sau đây

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

  • \ s chỉ định khoảng trắng

  •  + có nghĩa là ít nhất một trong các ký tự được đề cập trước đó cho +.


Trong trường hợp nhạy cảm A-Znê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 biểu thức chính quy định trong dấu chuỗi ("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 "cách sử dụng!
MohaMad

câu trả lời duy nhất phù hợp với tôi cho regex C ++ (ngoại trừ tôi đang thực hiện nó với trích dẫn thay vì dấu ngoặc). std::regex pattern{R"(["][a-zA-Z \s]+["])"};
StackAttack

3

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

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

(?: 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

3

Trong R, hãy thử:

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"

.. hoặc gsub(pat, "\\1", x, perl=TRUE), đâu patlà biểu thức chính quy mà bạn cung cấp ..
Karsten W.

0

Tôi cần bao gồm cả dòng mới và bao gồm cả dấu ngoặc

\[[\s\S]+\]


0

Để khớp chuỗi con giữa đầu tiên [cuối cùng ] , bạn có thể sử dụng

\[.*\]            # Including open/close brackets
\[(.*)\]          # Excluding open/close brackets (using a capturing group)
(?<=\[).*(?=\])   # Excluding open/close brackets (using lookarounds)

Xem bản demo regexbản demo regex # 2 .

Sử dụng các biểu thức sau để khớp chuỗi giữa các dấu ngoặc vuông gần nhất :

  • Bao gồm các dấu ngoặc:

    • \[[^][]*]- PCRE, Python re/ regex, .NET, Golang, POSIX (grep, sed, bash)
    • \[[^\][]*]- ECMAScript (JavaScript, C ++ std::regex, VBA RegExp)
    • \[[^\]\[]*] - Java regex
    • \[[^\]\[]*\] - Onigmo (Ruby, yêu cầu thoát dấu ngoặc ở mọi nơi)
  • Không bao gồm dấu ngoặc:

    • (?<=\[)[^][]*(?=])- PCRE, Python re/ regex, .NET (C #, v.v.), ICU (R stringr), Phần mềm JGSoft
    • \[([^][]*)]- Bash , Golang - chụp nội dung giữa các dấu ngoặc vuông bằng một cặp dấu ngoặc đơn không thoát, cũng xem bên dưới
    • \[([^\][]*)]- JavaScript , C ++std::regex , VBARegExp
    • (?<=\[)[^\]\[]*(?=]) - Java regex
    • (?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby, yêu cầu thoát dấu ngoặc ở mọi nơi)

LƯU Ý : *khớp 0 hoặc nhiều ký tự, sử dụng +để khớp 1 hoặc nhiều hơn để tránh khớp chuỗi trống trong danh sách / mảng kết quả.

Bất cứ khi nào cả hai hỗ trợ tìm kiếm đều có sẵn, các giải pháp trên đều dựa vào chúng để loại trừ khung mở / đóng hàng đầu. Mặt khác, dựa vào các nhóm bắt (liên kết đến các giải pháp phổ biến nhất trong một số ngôn ngữ đã được cung cấp).

Nếu bạn cần khớp các dấu ngoặc đơn lồng nhau , bạn có thể thấy các giải pháp trong biểu thức Chính quy để khớp chuỗi ngoặc đơn cân bằng và thay thế dấu ngoặc tròn bằng dấu ngoặc vuông để có được chức năng cần thiết. Bạn nên sử dụng các nhóm chụp để truy cập nội dung với khung mở / đóng được loại trừ:

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.