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?
\[start\](.*?)\[end\]
Zhich'll menempatkan teks di tengah hanya menangkap.
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)
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
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:
'/<a(.*?)a>/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.
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
}
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
Membaca teks dalam tanda kurung siku [] yaitu[Start] dan [End] dan memvalidasi array dengan daftar nilai. jsfiddle
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;
}