Ekspresi Reguler untuk menemukan string yang disertakan di antara dua karakter sambil MENGECUALIKAN pembatas

294

Saya perlu mengekstraksi serangkaian karakter yang termasuk di antara dua pembatas, tanpa mengembalikan pembatas itu sendiri.

Contoh sederhana harus bermanfaat:

Target : mengekstrak substring di antara tanda kurung kotak, tanpa mengembalikan tanda kurung itu sendiri.

String dasar :This is a test string [more or less]

Jika saya menggunakan reg berikut. ex.

\ [. *? \]

Pertandingannya adalah [more or less]. Saya hanya perlu mendapatkan more or less(tanpa tanda kurung).

Apakah mungkin untuk melakukannya?

Diego
sumber

Jawaban:

453

Mudah dilakukan:

(?<=\[)(.*?)(?=\])

Secara teknis itu menggunakan lookaheads dan lookbehinds. Lihat Lookahead dan Lookbehind Pernyataan Nol-Lebar . Polanya terdiri dari:

  • didahului oleh [yang tidak ditangkap (lihat di belakang);
  • kelompok yang ditangkap secara serakah. Tidak serakah untuk berhenti pada awalnya]; dan
  • diikuti oleh] yang tidak ditangkap (lookahead).

Atau Anda bisa menangkap apa yang ada di antara tanda kurung siku:

\[(.*?)\]

dan kembalikan grup yang ditangkap pertama alih-alih seluruh pertandingan.

cletus
sumber
138
"Mudah dilakukan", LOL! :) Ekspresi reguler selalu membuat saya sakit kepala, saya cenderung melupakannya begitu saya menemukan yang menyelesaikan masalah saya. Tentang solusi Anda: yang pertama berfungsi seperti yang diharapkan, yang kedua tidak, itu tetap termasuk tanda kurung. Saya menggunakan C #, mungkin objek RegEx memiliki "rasa" sendiri dari mesin regex ...
Diego
5
Itu melakukan itu karena Anda melihat seluruh pertandingan daripada kelompok yang cocok pertama.
cletus
Terima kasih banyak, situs web yang sangat berguna! Saya akan menyimpannya sebagai referensi. :) Maaf jika saya membuat beberapa kebingungan, C # pembangunan tidak benar-benar salah satu keterampilan saya ..
Diego
1
Apakah ini berfungsi jika substring juga mengandung pembatas? Misalnya, This is a test string [more [or] less]apakah ini akan kembali more [or] less?
gnzlbg
1
@gnzlbg tidak, ini akan mengembalikan "lebih [atau"
MerickOWA
52

Jika Anda menggunakan JavaScript , solusi pertama yang disediakan oleh cletus,, (?<=\[)(.*?)(?=\])tidak akan berfungsi karena JavaScript tidak mendukung operator yang melihat di belakang.

Namun, solusi kedua berfungsi dengan baik, tetapi Anda harus mendapatkan elemen yang cocok kedua.

Contoh:

var regex = /\[(.*?)\]/;
var strToMatch = "This is a test string [more or less]";
var matched = regex.exec(strToMatch);

Itu akan kembali:

["[more or less]", "more or less"]

Jadi, yang Anda butuhkan adalah nilai kedua. Menggunakan:

var matched = regex.exec(strToMatch)[1];

Mengembalikan:

"more or less"
Zanon
sumber
2
bagaimana jika ada beberapa kecocokan [lebih atau kurang] dalam string?
Pernyataan yang terlihat di belakang telah ditambahkan ke RegExp di ES2018
TheDarkIn1978
19

Anda hanya perlu 'menangkap' bit di antara tanda kurung.

\[(.*?)\]

Untuk menangkap Anda memasukkannya ke dalam tanda kurung. Anda tidak mengatakan bahasa yang digunakan ini. Di Perl misalnya, Anda akan mengakses ini menggunakan variabel $ 1.

my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";

Bahasa lain akan memiliki mekanisme berbeda. C #, misalnya, menggunakan kelas koleksi Match , saya percaya.

Xetius
sumber
Terima kasih, tetapi solusi ini tidak berhasil, itu tetap termasuk tanda kurung. Seperti yang saya tulis dalam komentar saya pada solusi Cletus, bisa jadi objek C # RegEx menafsirkannya secara berbeda. Saya bukan ahli C #, jadi itu hanya dugaan, mungkin hanya karena kurangnya pengetahuan saya. :)
Diego
11

[^\[] Cocokkan karakter apa pun yang bukan [.

+Cocokkan 1 atau lebih dari apa pun yang tidak [. Buat grup pertandingan ini.

(?=\])Penampilan positif ]. Cocokkan kelompok yang diakhiri dengan ]tanpa mencantumkannya dalam hasil.

Selesai

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

Bukti.

http://regexr.com/3gobr

Mirip dengan solusi yang diajukan oleh null. Tetapi tambahan \]tidak diperlukan. Sebagai catatan tambahan, tampaknya \tidak diperlukan untuk melarikan diri [setelah ^. Agar mudah dibaca, saya akan membiarkannya masuk.

Tidak berfungsi dalam situasi di mana pembatas identik. "more or less"sebagai contoh.

Stieneee
sumber
8

PHP:

$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);
powtac
sumber
4

Untuk menghapus juga [] gunakan:

\[.+\]
Cătălin Rădoi
sumber
Tetapi jika Anda memiliki dua set [] [], ada masalah dengan yang ini i.imgur.com/NEOLHZk.png
Cătălin Rădoi
3

Saya memiliki masalah yang sama menggunakan regex dengan bash scripting. Saya menggunakan solusi 2 langkah menggunakan pipa dengan menerapkan grep -o

 '\[(.*?)\]'  

pertama kemudian

'\b.*\b'

Jelas tidak seefisien jawaban lain, tetapi alternatif.

A. Jesús
sumber
3

Ini khusus berfungsi untuk parser ekspresi reguler javascript /[^[\]]+(?=])/g

jalankan saja ini di konsol

var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;
batal
sumber
2

Saya ingin mencari string antara / dan #, tetapi # terkadang opsional. Berikut adalah regex yang saya gunakan:

  (?<=\/)([^#]+)(?=#*)
techguy2000
sumber
0

Inilah cara saya mendapatkan tanpa '[' dan ']' dalam C #:

        var text = "This is a test string [more or less]";
        //Getting only string between '[' and ']'
        Regex regex = new Regex(@"\[(.+?)\]");
        var matchGroups = regex.Matches(text);
        for (int i = 0; i < matchGroups.Count; i++)
        {
            Console.WriteLine(matchGroups[i].Groups[1]);
        }

Outputnya adalah:

more or less
Jamaxack
sumber
-1

Jika Anda perlu mengekstrak teks tanpa tanda kurung, Anda dapat menggunakan bash awk

echo " [hola mundo] " | awk -F'[][]' '{print $2}'

hasil:

hola mundo

Nico
sumber