Köşeli ayraçlar arasında metin ayıklamak için normal ifade


411

Basit normal ifade sorusu. Aşağıdaki biçimde bir dize var:

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

Köşeli parantez içindeki kelimeleri ayıklamak için düzenli ifade nedir, yani.

sample
some
another one

Not: Kullanım durumumda, parantezler yuvalanamaz.

Yanıtlar:


766

Aşağıdaki normal ifadeyi global olarak kullanabilirsiniz :

\[(.*?)\]

Açıklama:

  • \[: [bir meta karakterdir ve kelimenin tam anlamıyla eşleşmek istiyorsanız çıkış yapılması gerekir.
  • (.*?) : her şeyi açgözlü olmayan bir şekilde eşleştirin ve yakalayın.
  • \]: ]bir meta karakterdir ve kelimenin tam anlamıyla eşleşmek istiyorsanız çıkış yapılması gerekir.

9
Kullanmanın diğer yanıt yöntemi, [^]]açgözlü olmayandan ( ?) daha hızlıdır ve aynı zamanda açgözlü olmayanları desteklemeyen regex tatları ile de çalışır. Ancak, açgözlü olmayan daha hoş görünüyor.
— Ipsquiggle

184
[ ]Çıktıdan nasıl çıkarılır (sonuç)?
— Mickey Tin

9
@MickeyTin, Java kullanıyorsanız, sadece grup () üzerinden grup (1) kullanarak gruplandırabilirsiniz, böylece '[]' birlikte gitmeyecektir
— abyteneverlie

21
Bu sadece ilk olayla eşleşir
— hfatahi

9
Köşeli parantezleri dönüşten nasıl hariç tutarsınız?
— jzadra

119
(?<=\[).+?(?=\])

Köşeli ayraç olmadan içerik yakalar

  • (?<=\[) - olumlu görüş [

  • .*? - içerik için açgözlü olmayan eşleşme

  • (?=\]) - olumlu ileri ]

EDIT: iç içe parantez için aşağıdaki normal ifade çalışmalıdır:

(\[(?:\[??[^\[]*?\]))

3
@igaurav Kontrol ettim ve işe yarıyor. Ancak Javascript gibi bakış açılarını desteklemeyen ortamlarda çalışmaz. Belki seninki senindir?
— Adam Moszczyński

Adam, içinde bir dize olduğunda yuvalanmış parantez çözümünüz başarısız ....
— patrick

89

Bu işe yarar tamam:

\[([^]]+)\]

5
Benim kullanım durumumda, köşeli ayraçlı metin yeni satırlar içerebilir ve bu normal ifade kabul edilir, ancak kabul edilen cevap yoktur.
— Dave

1
[^]] karakter sınıfı ne anlama geliyor? Neyle eşleşiyor?
— Richard

3
@Richard, ^ karakter sınıfını reddeder. "A olmayan herhangi bir karakter" anlamına gelir.
— jasonbar

8
Bence beklendiği gibi çalışmaz \[([^\[\]]*)\], içeriği en içteki parantez içinde almak için kullanmalısınız . Eğer içine bakarsak lfjlksd [ded[ee]22]o zaman \[([^]]+)\]alırsınız [ded[ee]Önerilen ifade dönecekti iken [ee]. testede bağlantı
— TMC

1
Bu normal ifadeyi kullanmak ve metni ayıklamak için lütfen 'sed' ve 'awk' örnekleri verebilir misiniz? Teşekkürler.
— valent

32

Parantezler yuvalanabilir mi?

Değilse: \[([^]]+)\]köşeli parantez dahil bir öğeyle eşleşir. Geri \1başvuru, eşleştirilecek öğeyi içerecektir. Normal reçineniz lezzeti aramayı destekliyorsa,

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

Bu yalnızca parantez içindeki öğeyle eşleşir.


@KunalMukherjee: Hayır, normal ifade istediğiniz sayıda eşleşebilir. Ancak, düzenli ifadeyi tekrar tekrar uygulamak için bazı düzenli ifadelere açıkça söylenmesi gerekir (örneğin, /gJavaScript'te bayrağı kullanarak ).
— Tim Pietzcker

14

Köşeli parantezleri oyuna dahil etmek istemiyorsanız, normal ifade: (?<=\[).*?(?=\])

Hadi yıkalım

.Satır sonlandırıcı dışında herhangi bir karakterle eşleşir. ?=Bir olan pozitif ileri yönlü . Pozitif bir ileri dönüş, belirli bir dize arkasından geldiğinde bir dize bulur. ?<=Bir olan pozitif olan ileriye dönük . Pozitif bir gözetleme, belirli bir dize ondan önce bir dize bulur. Alıntı bu ,

Olumlu bak (? =)

B ifadesinin takip ettiği A ifadesini bulun:

A(?=B)

Arkasına olumlu bak (? <=)

B ifadesinin önünde bulunduğu A ifadesini bulun:

(?<=B)A

Alternatif

Normal ifade motorunuz destek kafalarını ve geriye bakma \[(.*?)\]noktalarını desteklemiyorsa, bir gruptaki parantezlerin iç kısımlarını yakalamak için normal ifadeyi kullanabilir ve ardından grubu gerektiği gibi değiştirebilirsiniz.

Bu normal ifade nasıl çalışır?

Parantezler bir gruptaki karakterleri yakalar. .*?(Eğer yoksa, satır sonlandırıcı için hariç parantez tüm karakterlerle alır saçgözlü olmayan bir şekilde bayrak etkin).


12

(?<=\[).*?(?=\])Yukarıda verilen açıklamaya göre iyi çalışır. İşte bir Python örneği:

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

1
Göründükleri her yerde normal ifadeler için her zaman kod biçimlendirmesi kullanmalısınız. Normal ifade kod bloğundan ziyade metindeyse, bunları biçimlendirmek için geri işaretlerini kullanabilirsiniz. ( ref )
— Alan Moore

1
Ayrıca, soru parantez []değil köşeli parantez ( ) ile ilgiliydi .
— Alan Moore

6

Her ihtimale karşı, dengesiz köşeli paranteziniz olabilir, büyük olasılıkla özyineleme ile benzer bir ifade tasarlayabilirsiniz,

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

tabii ki, kullandığınız dil veya RegEx motoruyla ilgilidir.

RegEx Demosu 1


Ondan başka,

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

RegEx Demo 2

veya,

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

RegEx Demo 3

keşfetmek için iyi seçeneklerdir.


İfadeyi basitleştirmek / değiştirmek / keşfetmek istiyorsanız, regex101.com'un sağ üst panelinde açıklanmıştır . İsterseniz, bu bağlantıda bazı örnek girdilerle nasıl eşleşeceğini de izleyebilirsiniz .


RegEx Devresi

jex.im düzenli ifadeleri görselleştirir:

resim açıklamasını buraya girin

Ölçek

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

Kaynak

Dengeli parantezlerle eşleşecek düzenli ifade


4

dolgu yapmak istiyorsanız sadece köşeli ayraç az arasında küçük bir alfabe harf

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

küçük ve kapaklar istiyorsanız a-zA-Z harfi

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

küçük harfler ve rakamlar istiyorsanız a-zA-Z0-9

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

köşeli ayraç arasında her şeyi istiyorsanız

metin, sayı ve sembol istiyorsanız

(\[.*\])

3
([[][a-z \s]+[]])

Yukarıdaki açıklama aşağıdaki gibi çalışmalıdır

  • köşeli parantez içindeki karakterler [] characte sınıfını tanımlar, bu da desenin köşeli parantez içinde belirtilen en az bir karakterle eşleşmesi gerektiği anlamına gelir

  • \ s bir boşluk belirtir

  •  + daha önce + işaretinde belirtilen karakterlerden en az birini ifade eder.


Hassas durumlarda A-Zdesene eklemeniz gerekir ([[][a-zA-Z \s]+[]]):; Bence \ dize işaretleri ("ve") tanımlayan regex kalıpları ve "veya 'kullanımları ters eğik çizgi işleme ile yeni başlayanlar karıştırmak iyi bir yol olduğunu düşünüyorum !
— MohaMad

C ++ regex için benim için çalışan tek cevap (im köşeli ayraçlar yerine alıntılarla yapıyor hariç). std::regex pattern{R"(["][a-zA-Z \s]+["])"};
— StackAttack

3

Bu kod, köşeli ayraçlar ve parantezler arasındaki içeriği çıkarır

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

(?: 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

3

R'de şunu deneyin:

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"

..ya da gsub(pat, "\\1", x, perl=TRUE), patsağladığınız düzenli ifade nerede ..
— Karsten W.

0

Yeni satırları ve parantezleri dahil etmeye ihtiyacım vardı

\[[\s\S]+\]


0

Bir alt dizeyi ilk ve son arasında [ ] eşleştirmek için şunu kullanabilirsiniz:

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

Bir normal ifade demosu ve bir normal ifade demosu # 2'ye bakın .

En yakın köşeli ayraçlar arasındaki dizeleri eşleştirmek için aşağıdaki ifadeleri kullanın :

  • Parantez dahil:

    • \[[^][]*]- PCRE, Python re/ regex, .NET, Golang, POSIX (grep, sed, bash)
    • \[[^\][]*]- ECMAScript (JavaScript, C ++ std::regex, VBA RegExp)
    • \[[^\]\[]*] - Java normal ifadesi
    • \[[^\]\[]*\] - Onigmo (Ruby, her yerde parantezlerden kaçmayı gerektirir)
  • Parantez hariç:

    • (?<=\[)[^][]*(?=])- PCRE, Python re/ regex, .NET (C #, vb.), ICU (R stringr), JGSoft Yazılımı
    • \[([^][]*)]- Bash , Golang - köşeli parantezler arasındaki içeriği bir çift çıkışsız parantez ile yakalayın , ayrıca aşağıya bakın
    • \[([^\][]*)]- JavaScript , C ++std::regex , VBARegExp
    • (?<=\[)[^\]\[]*(?=]) - Java normal ifadesi
    • (?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby, her yerde parantezlerden kaçmayı gerektirir)

NOT : *0 veya daha fazla karakterle +eşleşir, sonuçtaki listede / dizide boş dize eşleşmelerini önlemek için 1 veya daha fazla eşleşmeyi kullanın .

Her iki arama desteği mevcut olduğunda, yukarıdaki çözümler ön / arka açma / kapama braketini dışlamak için bunlara güvenir. Aksi takdirde, yakalama gruplarına güvenin (bazı dillerde en yaygın çözümlere bağlantılar sağlanmıştır).

İç içe parantezleri eşleştirmeniz gerekiyorsa , düzenli parantezler iş parçacığını eşleştirmek için Düzenli ifadedeki çözümleri görebilir ve gerekli işlevselliği elde etmek için yuvarlak parantezleri köşeli parantezlerle değiştirebilirsiniz. İçeriği erişmek için açma / kapama braketi hariç tutulduğunda yakalama gruplarını kullanmalısınız:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.