Ekspresi reguler untuk mengekstrak teks di antara tanda kurung

412

Pertanyaan regex sederhana. Saya memiliki string pada format berikut:

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

Apa ekspresi reguler untuk mengekstrak kata-kata dalam tanda kurung siku, yaitu.

sample
some
another one

Catatan: Dalam kasus penggunaan saya, tanda kurung tidak dapat disarangkan.

ObiWanKenobi
sumber

Jawaban:

767

Anda dapat menggunakan regex berikut secara global :

\[(.*?)\]

Penjelasan:

  • \[: [adalah meta char dan harus diloloskan jika Anda ingin mencocokkannya secara harfiah.
  • (.*?) : cocokkan semuanya dengan cara yang tidak serakah dan tangkap.
  • \]: ]adalah meta char dan harus diloloskan jika Anda ingin mencocokkannya secara harfiah.
codaddict
sumber
9
Metode jawaban lain, menggunakan [^]]lebih cepat daripada non-serakah ( ?), dan juga bekerja dengan rasa regex yang tidak mendukung non-serakah. Namun, yang tidak rakus terlihat lebih baik.
Ipsquiggle
184
Bagaimana cara mengecualikan [ ]dari output (hasil)?
Mickey Tin
9
@MickeyTin, jika Anda menggunakan Java, Anda dapat mengelompokkannya menggunakan grup (1) di atas grup saja (), jadi '[]' tidak akan pergi bersama
abyteneverlie
21
Ini hanya cocok untuk kejadian pertama
hfatahi
9
Bagaimana Anda mengecualikan kurung dari pengembalian?
jzadra
119
(?<=\[).+?(?=\])

Akan mengambil konten tanpa tanda kurung

  • (?<=\[) - Terlihat positif di belakang [

  • .*? - Kecocokan non serakah untuk konten

  • (?=\]) - lookahead positif untuk ]

Sunting: untuk tanda kurung bersarang regex di bawah ini akan berfungsi:

(\[(?:\[??[^\[]*?\]))
Adam Moszczyński
sumber
3
@igaurav saya sudah memeriksanya dan berfungsi. Namun itu tidak akan berfungsi di lingkungan yang tidak mendukung tampilan seperti Javascript. Mungkin itu kasusmu?
Adam Moszczyński
Adam, solusi kurung bersarang Anda gagal ketika ada string dengan .di dalamnya ...
patrick
89

Ini seharusnya berhasil:

\[([^]]+)\]
jasonbar
sumber
5
Dalam kasus penggunaan saya, teks kurung mungkin menyertakan baris baru, dan regex ini berfungsi, sedangkan jawaban yang diterima tidak.
Dave
1
apa yang dimaksud dengan kelas karakter [^]]? Apa yang cocok?
Richard
3
@Richard, The ^ meniadakan kelas karakter. Ini berarti "karakter apa pun yang bukan]".
jasonbar
8
Saya pikir itu tidak berfungsi seperti yang diharapkan, Anda harus menggunakan \[([^\[\]]*)\]untuk mendapatkan konten di braket paling dalam. Jika Anda melihat ke dalam lfjlksd [ded[ee]22]maka \[([^]]+)\]Anda akan mendapatkan [ded[ee]sementara ekspresi yang diusulkan akan kembali [ee]. testede in link
TMC
1
Bisakah Anda memberikan contoh 'sed' dan 'awk' untuk menggunakan regex ini dan ekstrak teks. Terima kasih.
valentt
32

Bisakah kurung bersarang?

Jika tidak: \[([^]]+)\]cocok dengan satu item, termasuk tanda kurung. Referensi balik \1akan berisi item yang cocok. Jika rasa regex Anda mendukung lookaround, gunakan

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

Ini hanya akan cocok dengan item di dalam tanda kurung.

Tim Pietzcker
sumber
@KunalMukherjee: Tidak, regex dapat cocok beberapa kali. Tetapi beberapa rasa regex perlu diberitahukan secara eksplisit untuk menerapkan regex berulang kali (misalnya, dengan menggunakan /gbendera di JavaScript).
Tim Pietzcker
14

Jika Anda tidak ingin menyertakan tanda kurung dalam pertandingan, inilah regexnya: (?<=\[).*?(?=\])

Mari kita jabarkan

The .cocok dengan sembarang karakter kecuali untuk line terminator. Ini ?=adalah tampilan yang positif . Seorang lookahead positif menemukan string ketika string tertentu datang setelahnya. Ini ?<=adalah tampilan positif di belakang . Pandangan positif di balik menemukan string ketika string tertentu mendahuluinya. Mengutip ini ,

Lihat ke depan positif (? =)

Temukan ekspresi A di mana ekspresi B berikut:

A(?=B)

Lihat di belakang positif (? <=)

Temukan ekspresi A di mana ekspresi B mendahului:

(?<=B)A

Alternatifnya

Jika mesin regex Anda tidak mendukung lookaheads dan lookbehinds, maka Anda dapat menggunakan regex \[(.*?)\]untuk menangkap jeroan kurung dalam sebuah grup dan kemudian Anda dapat memanipulasi grup sesuai kebutuhan.

Bagaimana cara kerja regex ini?

Tanda kurung menangkap karakter dalam grup. The .*?mendapatkan semua karakter antara tanda kurung (kecuali untuk terminator garis, kecuali jika Anda memiliki sbendera diaktifkan) dengan cara yang tidak serakah.

LJ Germain
sumber
12

(?<=\[).*?(?=\])berfungsi baik sesuai penjelasan yang diberikan di atas. Berikut ini contoh 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'"
devd
sumber
1
Anda harus selalu menggunakan pemformatan kode untuk regex, di mana pun mereka muncul. Jika regex berada dalam teks daripada blok kode, Anda dapat menggunakan backtick untuk memformatnya. ( ref )
Alan Moore
1
Juga, pertanyaannya adalah tentang tanda kurung ( []), bukan tanda kurung.
Alan Moore
6

Untuk jaga-jaga, Anda mungkin memiliki tanda kurung tidak seimbang , Anda mungkin dapat merancang beberapa ekspresi dengan rekursi yang mirip dengan,

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

yang tentu saja, itu akan berhubungan dengan bahasa atau mesin RegEx yang mungkin Anda gunakan.

Demo RegEx 1


Selain itu,

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

Demo RegEx 2

atau,

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

Demo RegEx 3

adalah pilihan yang baik untuk dijelajahi.


Jika Anda ingin menyederhanakan / memodifikasi / menjelajahi ekspresi, sudah dijelaskan di panel kanan atas regex101.com . Jika mau, Anda juga dapat menonton di tautan ini , bagaimana itu cocok dengan beberapa input sampel.


Sirkuit RegEx

jex.im memvisualisasikan ekspresi reguler:

masukkan deskripsi gambar di sini

Uji

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}`);
    });
}

Sumber

Ekspresi reguler untuk mencocokkan tanda kurung yang seimbang

Emma
sumber
4

jika Anda ingin mengisi hanya huruf alfabet kecil antara braket persegi az

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

jika Anda ingin huruf kecil dan huruf a-zA-Z

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

jika Anda ingin topi kecil dan nomor huruf a-zA-Z0-9

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

jika Anda ingin semuanya antara braket persegi

jika Anda ingin teks, angka dan simbol

(\[.*\])
ßãlãjî
sumber
3
([[][a-z \s]+[]])

Di atas harus bekerja diberikan penjelasan berikut

  • karakter dalam tanda kurung siku [] mendefinisikan kelas characte yang berarti pola harus cocok setidaknya satu karakter yang disebutkan dalam tanda kurung kotak

  • Menentukan spasi

  •  + Berarti minimal salah satu karakter yang disebutkan sebelumnya ke +.

hantu
sumber
Dalam kasus A-Z- kasus sensitif harus menambah pola ([[][a-zA-Z \s]+[]]):; Saya pikir itu cara yang baik, sementara \ dalam pola regex yang mendefinisikan dalam tanda string ("dan ​​') dan mencampur pemula dengan penanganan backslash dalam" atau' penggunaan!
MohaMad
satu-satunya jawaban yang bekerja untuk saya untuk C ++ regex (kecuali saya melakukannya dengan kutipan, bukan kurung). std::regex pattern{R"(["][a-zA-Z \s]+["])"};
StackAttack
3

Kode ini akan mengekstraksi konten antara tanda kurung dan kurung

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

(?: 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
Nezar Fadle
sumber
3

Di R, coba:

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"
Tony Ladson
sumber
..atau gsub(pat, "\\1", x, perl=TRUE), di mana patekspresi reguler yang Anda berikan ..
Karsten W.
0

Saya perlu memasukkan baris baru dan termasuk tanda kurung

\[[\s\S]+\]

citynorman
sumber
0

Untuk mencocokkan substring antara yang pertama [ dan yang terakhir ] , Anda dapat menggunakan

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

Lihat demo regex dan demo regex # 2 .

Gunakan ekspresi berikut untuk mencocokkan string antara tanda kurung kotak terdekat :

  • Termasuk tanda kurung:

    • \[[^][]*]- PCRE, Python re/ regex, .NET, Golang, POSIX (grep, sed, bash)
    • \[[^\][]*]- ECMAScript (JavaScript, C ++ std::regex, VBA RegExp)
    • \[[^\]\[]*] - regex Jawa
    • \[[^\]\[]*\] - Onigmo (Ruby, membutuhkan pelarian di mana-mana)
  • Tidak termasuk tanda kurung:

    • (?<=\[)[^][]*(?=])- PCRE, Python re/ regex, .NET (C #, dll.), ICU (R stringr), Perangkat Lunak JGSoft
    • \[([^][]*)]- Bash , Golang - tangkap isi antara tanda kurung siku dengan sepasang tanda kurung yang tidak dilepas, juga lihat di bawah
    • \[([^\][]*)]- JavaScript , C ++std::regex , VBARegExp
    • (?<=\[)[^\]\[]*(?=]) - regex Jawa
    • (?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby, membutuhkan pelarian di mana-mana)

CATATAN : *cocok dengan 0 atau lebih karakter, gunakan +untuk mencocokkan 1 atau lebih untuk menghindari kecocokan string kosong dalam daftar / array yang dihasilkan.

Setiap kali kedua dukungan lookaround tersedia, solusi di atas bergantung pada mereka untuk mengecualikan braket buka / tutup terkemuka / tertinggal. Jika tidak, andalkan kelompok penangkap (tautan ke solusi paling umum dalam beberapa bahasa telah disediakan).

Jika Anda harus mencocokkan tanda kurung bersarang , Anda dapat melihat solusi dalam ekspresi Reguler untuk mencocokkan untaian tanda kurung yang seimbang dan mengganti tanda kurung bulat dengan tanda kurung siku untuk mendapatkan fungsionalitas yang diperlukan. Anda harus menggunakan grup penangkap untuk mengakses konten dengan braket buka / tutup dikecualikan:

Wiktor Stribiżew
sumber