Regex: Untuk menarik keluar sub-string antara dua tag dalam string

Saya memiliki file dalam format berikut:

Data Data
Data
[Start]
Data yang saya inginkan
[End]
Data

I'a ingin ambil Data aku ingin antara [Start] dan [End] tag menggunakan Regex. Adakah yang bisa menunjukkan saya bagaimana ini bisa dilakukan?

Mengomentari pertanyaan (1)
\[start\](.*?)\[end\]

Zhich'll menempatkan teks di tengah hanya menangkap.

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

Ini harus mudah-mudahan drop [start] dan [end] spidol juga.

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

Saya punya masalah yang sama untuk sementara & saya dapat memberitahu anda metode ini bekerja...

Komentar (0)

Sementara anda dapat menggunakan ekspresi reguler untuk mengurai data antara tag pembuka dan penutup, anda harus berpikir panjang dan keras, apakah ini adalah jalan yang anda inginkan untuk turun. Alasan untuk itu adalah potensi kategori ke sarang: jika bersarang tags pernah terjadi atau mungkin terjadi, bahasa dikatakan tidak lagi menjadi teratur, dan ekspresi reguler berhenti menjadi alat yang tepat untuk parsing itu.

Banyak ekspresi reguler implementasi, seperti PCRE atau perl's ekspresi reguler, dukungan kemunduran yang dapat digunakan untuk mencapai efek kasar. Tapi PCRE (tidak seperti perl) doesn't dukungan terbatas kemunduran, dan ini benar-benar dapat menyebabkan hal-hal untuk istirahat dengan cara aneh segera setelah anda memiliki terlalu banyak tag.

Ada's yang sangat sering dikutip posting blog yang membahas hal ini lebih lanjut, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (google untuk itu dan memeriksa cache saat ini, mereka tampaknya memiliki beberapa downtime)

Komentar (0)

Diskusi lebih lengkap dari perangkap menggunakan regex untuk menemukan pencocokan kategori dapat ditemukan di: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi. Khususnya, harus menyadari bahwa bersarang kategori benar-benar membutuhkan penuh parser dalam rangka untuk ditafsirkan dengan benar.

Perhatikan bahwa kasus sensitivitas akan perlu dimatikan dalam rangka untuk menjawab pertanyaan seperti yang dinyatakan. Di perl, yang's i modifier:

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

Trik lainnya adalah dengan menggunakan *? quantifier yang mematikan berhasil ditangkap pertandingan. Misalnya, jika anda memiliki non-matching [end] tag:

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

mungkin anda don't ingin menangkap:

 Data i want [End] Data
Komentar (0)

Nah, jika anda menjamin bahwa setiap start tag diikuti dengan tag akhir maka berikut ini akan bekerja.

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

Namun, Jika anda memiliki teks yang kompleks seperti berikut:

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

maka anda akan mengalami masalah dengan regex.

Sekarang contoh berikut akan menarik semua link hot di laman:

'//i'

Dalam kasus di atas kita dapat menjamin bahwa tidak akan ada bersarang kasus-kasus:

'<a></a>'

Jadi, ini adalah pertanyaan yang kompleks dan dapat't hanya dapat diselesaikan dengan jawaban yang sederhana.

Komentar (0)

Dengan Perl anda dapat mengelilingi data yang anda inginkan dengan ()'s dan tarik keluar nantinya, mungkin bahasa-bahasa lain yang memiliki fitur serupa.

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
}
Komentar (0)

Mengacu pada pertanyaan ini untuk menarik keluar teks antara tag dengan karakter spasi dan titik-titik (.)

[\S\s] adalah salah satu yang saya digunakan

https://stackoverflow.com/questions/8303488/regex-to-match-any-character-including-new-lines

Komentar (0)

Membaca teks dalam tanda kurung siku [] yaitu[Start] dan [End] dan memvalidasi array dengan daftar nilai. 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;
}
Komentar (0)