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:


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

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)


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 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.


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"

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.


14

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

(?<=\{)(.*?)(?=\})

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"]

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 

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

\{([^{}]+)\}

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.



2

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

\{([^()]|())*\}

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}]
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.