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?


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.


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"

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.


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.


8

PHP:

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


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.


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;

2

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

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

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

-1

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

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

hasil:

hola mundo

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.