Regex untuk mendapatkan string di antara tanda kurung kurawal

115

Sayangnya, meskipun telah mencoba mempelajari regex setidaknya satu kali dalam setahun selama bertahun-tahun yang saya ingat, saya selalu lupa karena saya jarang menggunakannya. Tahun ini resolusi tahun baru saya adalah untuk tidak mencoba dan mempelajari regex lagi - Jadi tahun ini untuk menyelamatkan saya dari air mata, saya akan memberikannya ke Stack Overflow . (Remix Natal terakhir).

Saya ingin meneruskan string dalam format ini {getThis}, dan mengembalikan string tersebut getThis. Adakah yang bisa membantu untuk tetap berpegang pada resolusi tahun baru saya?


Pertanyaan terkait tentang Stack Overflow:

ChrisInCambo
sumber
5
Pertanyaan ini telah ditambahkan ke FAQ Ekspresi Reguler Stack Overflow , di bawah "Advanced Regex-Fu".
aliteralmind
@Kobi: FAQ adalah wiki. Siapapun bisa mengeditnya. Jadi edit itu.
aliteralmind

Jawaban:

44

Jika string Anda akan selalu dalam format itu, ekspresi reguler berlebihan:

>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"

substring(1Berarti memulai satu karakter dalam (melewati yang pertama {) dan ,g.length-1)berarti mengambil karakter sampai (tetapi tidak termasuk) karakter pada panjang string minus satu. Ini berfungsi karena posisinya berbasis nol, yaitu g.length-1posisi terakhir.

Bagi pembaca selain pembuatnya: Jika memiliki menjadi regex, gunakan /{([^}]*)}/jika Anda ingin mengizinkan string kosong, atau /{([^}]+)}/jika Anda ingin hanya cocok ketika ada setidaknya satu karakter antara kurung kurawal. Kerusakan:

  • /: mulai pola regex
    • {: penjepit keriting literal
      • (: mulai menangkap
        • [: mulai menentukan kelas karakter yang akan ditangkap
          • ^}: "apa pun selain }"
        • ]: OK, itulah definisi seluruh kelas kami
        • *: sejumlah karakter yang cocok dengan kelas yang baru saja kita tentukan
      • ): selesai menangkap
    • }: penjepit keriting literal harus segera mengikuti apa yang kita tangkap
  • /: akhiri pola regex
Kev
sumber
7
Substring adalah salah satu hal yang berubah berdasarkan bahasa tempat Anda bekerja. Javascript menghentikan indeks, PHP mengambil panjang hasil akhir yang diinginkan (kecuali negatif, dalam hal ini dibutuhkan jumlah karakter untuk dihapus) , C # berbeda lagi ... bagus dan membingungkan.
jvenema
2
... dan Python baru saja mengiris, yang IMO lebih baik dari apa pun: p.
Berikan Paul
27
Manis, tapi tidak yakin bagaimana itu ungkapan biasa. Mungkin dia meminta regex, dan saya datang ke sini untuk jawaban yang sama .. sayangnya jawabannya tidak ada hubungannya dengan pertanyaan itu ..
baash05
5
@ baash05, jika Anda membaca seluruh pertanyaan, OP bahkan tidak ingin mempelajari regex, jadi menurut saya bukan latihan akademis yang Anda sarankan.
Kev
2
Saya ingin melakukan -1 karena pertanyaannya adalah meminta regex , saya sedang mencari regex , tetapi jawaban yang diterima sama sekali tidak berguna bagi saya (sementara pertanyaan itu sendiri tampak sangat menjanjikan). Setelah membaca komentar pertama, saya harus mengakui bahwa jika saya menjawab pertanyaan ini terlebih dahulu, saya bisa menjawab dengan cara yang sama / mirip ... Jadi pada akhirnya, +1.
shadyyx
250

Mencoba

/{(.*?)}/

Artinya, cocokkan karakter apa pun antara {dan}, tetapi jangan serakah - cocokkan string terpendek yang diakhiri dengan} (? Stop * menjadi serakah). Tanda kurung memungkinkan Anda mengekstrak bagian yang cocok.

Cara lain adalah

/{([^}]*)}/

Ini cocok dengan semua karakter kecuali a} char (cara lain untuk tidak serakah)

Paul Dixon
sumber
ini luar biasa, tetapi apakah mungkin untuk mencocokkan apa pun di antara sejumlah variabel kombinasi kurung kurawal? Misalnya: "{this should be matched} this shouldnt {kinda should again} dan seterusnya {on}"? Saya ingin mendapatkan kembali nilainya, yang tidak ada dalam tanda kurung kurawal. Juga: tanda kurung kurawal tidak akan digunakan dalam kalimat dan tidak ada penumpukan (ini tidak akan pernah terjadi: "{some {text}}"). Ada yang tahu bagaimana melakukannya :)? Terima kasih! (ps: memilih solusi ini)
Igor
4
Itu tidak menangkap semua yang ada di antara tanda kurung kurawal, tapi menangkap semua yang ada di antara tanda kurung kurawal DAN tanda kurung itu sendiri. Bagaimana cara Anda HANYA menangkap apa yang ada di dalam tanda kurung kurawal?
Reality-Torrent
1
Saya suka Anda tidak perlu melepaskan tanda kurung kurawal di sini karena pengurai regex tampaknya menyadari bahwa itu bukan pembilang ... yah, saya melakukan ini dengan python, tapi saya menganggap regex javascript berfungsi seperti itu juga
drevicko
3
Menambahkan a gdi akhir membuatnya menjadi pencarian global. Lihat contoh kerja
Benjamin
1
@ Reality-Torrent, saya juga melihat bahwa itu menangkap tanda kurung kurawal jika saya menentukan opsi g untuk mendapatkan semua kecocokan. Ternyata saya harus menggunakan Regex.exec dalam satu lingkaran daripada string.match di Javascript untuk memiliki kedua bendera g, dan memungkinkan untuk menangkap grup. Lihat developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
jujur
150
/\{([^}]+)\}/

/        - delimiter
\{       - opening literal brace escaped because it is a special character used for quantifiers eg {2,3}
(        - start capturing
[^}]     - character class consisting of
    ^    - not
    }    - a closing brace (no escaping necessary because special characters in a character class are different)
+        - one or more of the character class
)        - end capturing
\}       - the closing literal brace
/        - delimiter
meouw
sumber
@meouw sa = s.split ("/ \ {([^}] +) \} /"); memberikan kesalahan kompilasi. pengulangan ilegal, karakter pelarian tidak valid.
likejudo
@Anil Anda tampaknya menggunakan string sebagai argumen pemisah Anda daripada ekspresi reguler. Apa yang sedang Anda coba lakukan?
meouw
30

Coba ini:

/[^{\}]+(?=})/g

Sebagai contoh

Welcome to RegExr v2.1 by #{gskinner.com},  #{ssd.sd} hosted by Media Temple!

akan kembali gskinner.com, ssd.sd.

Mohamed Abo Elmagd
sumber
1
Bagus, dapatkah Anda menjelaskan mengapa Anda menggunakan \}blok pertama?
Uzair Ali
1
Bagus, tapi itu akan cocok dengan grup mana pun yang diakhiri }, bahkan jika tidak dimulai {.
Ahmad Ibrahim
1
Ini adalah satu-satunya jawaban benar yang benar-benar berfungsi.
pldg
Penjelasan: Meskipun [^ \ {\}] + akan cocok dengan apa pun yang bukan kurung kurawal, pernyataan lookahead (? =}) Akan memastikan untuk hanya meneruskan bagian sebelum kurung kurawal. Dengan / ... / g kita mendapatkan semua kemunculan, tidak hanya yang pertama.
0 -_- 0
19

Berikut solusi sederhana menggunakan ganti javascript

var st = '{getThis}';

st = st.replace(/\{|\}/gi,''); // "getThis"

Seperti yang ditunjukkan jawaban yang diterima di atas, masalah asli mudah diselesaikan dengan substring, tetapi menggunakan replace dapat menyelesaikan kasus penggunaan yang lebih rumit

Jika Anda memiliki string seperti "randomstring999 [fieldname]" Anda menggunakan pola yang sedikit berbeda untuk mendapatkan fieldname

var nameAttr = "randomstring999[fieldname]";

var justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"
berdentang
sumber
15

Yang ini berfungsi di Textmate dan cocok dengan semua yang ada di file CSS di antara tanda kurung kurawal.

\{(\s*?.*?)*?\}

selector {. . matches here including white space. . .}

Jika Anda ingin lebih dapat mengembalikan konten, maka bungkus semuanya dalam satu set tanda kurung seperti ini:

\{((\s*?.*?)*?)\}

dan Anda dapat mengakses isinya melalui $ 1.

Ini juga berfungsi untuk fungsi, tetapi saya belum mengujinya dengan tanda kurung kurawal bersarang.

Alex Kessaris
sumber
14

Anda ingin menggunakan regex lookahead dan lookbehind. Ini hanya akan memberi Anda apa yang ada di dalam kurung kurawal:

(?<=\{)(.*?)(?=\})
Robert Cesaric
sumber
Harus ada garis miring terbalik dari tanda kurung kurawal di atas. Mereka dilucuti dalam pengajuan saya.
Robert Cesaric
1
Terima kasih, ini membantu saya hari ini.
ProfessionalAmateur
ada kerugian dari metode ini?
Somatik
5
@ Somatik — ya, pandangan negatif ke belakang tidak didukung di ECMAScript.
RobG
Catatan: Contoh ini berfungsi di Java. Mengembalikan semua nilai dalam semua tanda kurung kurawal.
Multiplexor
13

Coba ini

let path = "/{id}/{name}/{age}";
const paramsPattern = /[^{\}]+(?=})/g;
let extractParams = path.match(paramsPattern);
console.log("extractParams", extractParams) // prints all the names between {} = ["id", "name", "age"]
Hemadri Dasari
sumber
1
Persis apa yang saya inginkan :) ini akan mengembalikan hasil tanpa kawat gigi, solusi lain kembali bersamanya
Al-Mothafar
Luar biasa, jawaban terbaik di sini.
michal.jakubeczy
4

Regex untuk mendapatkan array string dengan kurung kurawal tertutup terjadi dalam string, bukan hanya menemukan kemunculan pertama.

 /\{([^}]+)\}/gm 
Er. Mohit Agrawal
sumber
4

Saya telah melihat ke dalam jawaban lain, dan logika penting tampaknya hilang dari mereka. yaitu, pilih semuanya di antara dua tanda kurung KONSEKUTIF, tetapi BUKAN tanda kurung

jadi, inilah jawaban saya

\{([^{}]+)\}
souparno majumder
sumber
3
var re = /{(.*)}/;
var m = "{helloworld}".match(re);
if (m != null)
    console.log(m[0].replace(re, '$1'));

.replace(/.*{(.*)}.*/, '$1')Sayangnya, yang lebih sederhana mengembalikan seluruh string jika regex tidak cocok. Potongan kode di atas dapat lebih mudah mendeteksi kecocokan.

Curtis Yallop
sumber
3

Coba yang ini, menurut http://www.regextester.com, ini berfungsi untuk js normaly.

([^{]*?)(?=\})

Павло Коменда
sumber
3
untuk beberapa pilihan Anda dapat menggunakan /([^{]*?)\w(?=\})/gmi
Павло Коменда
2

Anda dapat menggunakan rekursi regex ini untuk mencocokkan semuanya, bahkan yang lain {}(seperti teks JSON):

\{([^()]|())*\}
p3quod
sumber
Bagus, tapi ini hanya menangkap konten di dalam kurung kurawal
Dominic
tidak menangkap jika konten berisi ()
Mert Mertce
1

Bahkan ini membantu saya saat mencoba menyelesaikan masalah seseorang,

Pisahkan konten di dalam kurung kurawal ( {}) yang memiliki pola seperti {'day': 1, 'count': 100},.

Sebagai contoh:

#include <iostream> 
#include <regex> 
#include<string> 
using namespace std; 

int main() 
{ 
    //string to be searched
    string s = "{'day': 1, 'count': 100}, {'day': 2, 'count': 100}";

    // regex expression for pattern to be searched 
    regex e ("\\{[a-z':, 0-9]+\\}");
    regex_token_iterator<string::iterator> rend;

    regex_token_iterator<string::iterator> a ( s.begin(), s.end(), e );
    while (a!=rend) cout << " [" << *a++ << "]";
    cout << endl;

    return 0; 
}

Keluaran:

[{'day': 1, 'count': 100}] [{'day': 2, 'count': 100}]
Shudipta Sharma
sumber