Regex: Bir dizede iki etiketin arasına bir alt dize çekin

oy
42

Ben aşağıdaki biçimde bir dosya var:

Veri Veri
Veri
[Başla]
Veri istediğim
[Son]
Veri

Ben kapmak istiyorum Data I wantarasından [Start]ve [End]bir Regex kullanarak etiketleri. Herkes bu nasıl yapılabileceğini gösterir misin?

Oluştur 04/08/2008 saat 14:47
kaynak kullanıcı
Diğer dillerde...                            


9 cevaplar

oy
63
\[start\](.*?)\[end\]

Zhich'll bir yakalama içinde ortada metni koydu.

Cevap 04/08/2008 saat 14:52
kaynak kullanıcı

oy
22

\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

Bu umutla damla gerekir [start]ve [end]belirteçler de.

Cevap 04/08/2008 saat 14:55
kaynak kullanıcı

oy
5
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

Bir süre benzer bir sorun vardı & bu yöntem çalışır söyleyebilirim ...

Cevap 06/10/2012 saat 17:52
kaynak kullanıcı

oy
4

Eğer açılış ve kapanış etiketleri arasında veri ayrıştırmak için normal bir ifade kullanmak mümkün olmakla birlikte, bu aşağı gitmek istediğiniz bir yol olup olmadığına dair uzun ve zor düşünmek gerekir. Bunun nedeni yuvasına etiketlerin potansiyelidir: yuvalama etiketleri hiç olabilirdi veya hiç ortaya çıkabilir eğer, dil artık normal olduğu söylenir ve düzenli ifadeler ayrıştırma için uygun bir araç olmaktan.

Böyle PCRE'nin veya perl düzenli ifadeler, bu kaba etkiyi elde etmek için kullanılabilecek destek Backtracking gibi birçok normal ifade uygulamaları. Ama (Perlde aksine) PCRE sınırsız backtracking desteklemez ve bu aslında işler kısa sürede çok fazla etiket olduğu gibi garip şekillerde bozulmasına neden olabilir.

Bu daha tartışır çok sık anılan blog yazısı var, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (bunun için google ve şu anda önbelleği kontrol, bunlar bazı kesintiler yaşıyor gibisin)

Cevap 15/09/2008 saat 15:18
kaynak kullanıcı

oy
4

: Eşleşen etiketleri bulmak için bir normal ifade kullanarak tuzaklar daha tam tartışması bulunabilir http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . Özellikle, yuvalama etiketler gerçekten sırayla tam teşekküllü ayrıştırıcı doğru yorumlanması gerektiğini unutmayın.

Belirtildiği gibi bu durumda duyarlılık soruya cevap verebilmek için kapatılabilir gerekecektir unutmayın. Perlde, işte ben değiştirici:

$ echo "Data Data Data [Start] Data i want [End] Data" \
  | perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
 Data i want 

Diğer hüner kullanmaktır *? Yakalanan maçın gözlülüğü kapatır miktar belirleyici. Örneğin, bir eşleşmeyen varsa [sonu] etiketi:

Data Data [Start] Data i want [End] Data [end]

muhtemelen yakalamak istemiyorum:

 Data i want [End] Data
Cevap 20/08/2008 saat 20:14
kaynak kullanıcı

oy
3

Her başlangıç ​​etiketi bir bitiş etiketi izler garanti buysa, o zaman şu çalışacak.

\[start\](.*?)\[end\]

Ancak, bu tür follwoing gibi karmaşık metin varsa:

[start] sometext [start] sometext2 [end] sometext [end]

o zaman regex sorun haline çalıştırmak olacaktır.

Şimdi Aşağıdaki örnek bir sayfadaki tüm sıcak bağlantıları çeker:

'/<a(.*?)a>/i'

Yukarıdaki durumda biz herhangi iç içe durumlar olmaz garanti edemez:

'<a></a>'

Yani, bu karmaşık bir sorudur ve sadece basit bir cevap çözülemez.

Cevap 11/05/2009 saat 21:08
kaynak kullanıcı

oy
1

Perl ile belki diğer diller benzer bir özellik var, (ın) ile istediğiniz verileri çevreleyen ve daha sonra onu çıkarır.

if ($s_output =~ /(data data data data START(data data data)END (data data)/) 
{
    $dataAllOfIt = $1;      # 1 full string
    $dataInMiddle = $2;     # 2 Middle Data
    $dataAtEnd = $3;        # 3 End Data
}
Cevap 04/08/2008 saat 15:00
kaynak kullanıcı

oy
0

Kare parantez [], yani [Başlangıç] ve [End] ve metin okuma değerleri listesi ile birlikte bir dizi doğrulamak. jsfiddle http://jsfiddle.net/muralinarisetty/r4s4wxj4/1/

var mergeFields = ["[sitename]",
                   "[daystoholdquote]",
                   "[expires]",
                   "[firstname]",
                   "[lastname]",
                   "[sitephonenumber]",
                   "[hoh_firstname]",
                   "[hoh_lastname]"];       

var str = "fee [sitename] [firstname] \
sdfasd [lastname] ";
var res = validateMeargeFileds(str);
console.log(res);

function validateMeargeFileds(input) {
    var re = /\[\w+]/ig;
    var isValid;
    var myArray = input.match(re);

    try{
        if (myArray.length > 0) {
            myArray.forEach(function (field) {

                isValid = isMergeField(field);

                if (!isValid){
                   throw e;                        
                }
            });
        }
    }
    catch(e) {        
    }

    return isValid;
}

function isMergeField(mergefield) {
    return mergeFields.indexOf(mergefield.toLowerCase()) > -1;
}
Cevap 12/09/2014 saat 09:26
kaynak kullanıcı

oy
0

(Boşluk karakterleri ve noktalarla etiketleri arasında metin ortaya çıkarmak üzere bu soruya bakın .)

[\S\s] Kullandığım biridir

Regex yeni hatlar da dahil olmak üzere herhangi bir karakteri eşleştirmek için

Cevap 28/08/2013 saat 22:12
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more