Düzenli ifade kullanarak parantez eşleşen bul [kapalı]

6 Cevap php

Ben bu string: "abc{def{ghi{jkl}mno{pqr}st}uvw}xyz" var varsayarsak

"{def{ghi{jkl}mno{pqr}st}uvw}": ve ben bu maç için istiyorum

ne benim düzenli ifade gibi görünmelidir ..?

Diğer bir deyişle, maç "{" ve sonunda "}" ile başlamalı, ancak arasında birçok {'olarak s}' s olmalıdır.

6 Cevap

Ben başka bir iş parçacığı cevabını buldum ..

"#\{((?>[^\{\}]+)|(?R))*\}#x"

Ben farklı dizeleri ile test edilmiş ve bu işi yapmak gibi görünüyor ..

Nasıl çalıştığı hakkında herhangi bir yorum ..? Artıları ve eksileri ..?

Btw cevaplar için teşekkürler .. :)

Bu nedenle dilbilgisi bunu ayrıştırmak için normal bir ifade kullanamazsınız, düzensizdir.

Eğer teknik olarak bunu yapmak için PCRE'yi kullanabilirsiniz iken, (PCRE aslında özyineleme operatör aracılığıyla belli olmayan düzenli ifadeler ayrıştırma kapasitesine sahip olduğunu, ancak bu hızla aşırı karmaşık hale gelebilir) kötü bir fikir.

Sen dize yoluyla sadece dolaşır şey yazma ve orada kaç anda açık parantez izler daha iyiyiz.

Sonra 'eşleştirme çifti' almak için birlikte iki atama açık her ve kapanış parantez karakter konumunda sonu yapma not ya da başlar bir senaryo geliştirmek istiyorsunuz. Bundan biraz daha karmaşık tabii ki, ama ben de alıyorum anlamak umuyoruz.

#!/usr/bin/perl
use strict;
use warnings;

my $str = "abc{def{ghi{jkl}mno{pqr}st}uvw}xyz" ;
$str =~ /[^{]*({.*})/ ;
print $1 ;

ve sonuç:

{def{ghi{jkl}mno{pqr}st}uvw}

ihtiyaçlarınızı karşılayacak? Ben php ile aşina değilim, ama ben hala aynı regex kullanabilirsiniz sanırım.

Sizin ifade olabilir:

\{.*\}

'*' Açgözlü, bu yüzden son dirseğini bulana kadar ilk dirseğinden şeyi alırsınız