Regex:إلى سحب السلسلة الفرعية بين اثنين من العلامات في سلسلة

StackOverflow https://stackoverflow.com/questions/1237

  •  08-06-2019
  •  | 
  •  

سؤال

لدي ملف في الشكل التالي:

Data Data
Data
[Start]
Data I want
[End]
Data

أود أن الاستيلاء على Data I want من بين [Start] و [End] العلامات باستخدام التعابير المنطقية.يمكن لأي شخص أن تبين لي كيف يمكن أن يتم ذلك ؟

هل كانت مفيدة؟

المحلول

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

وينبغي أن نأمل أن إسقاط [start] و [end] علامات أيضا.

نصائح أخرى

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

Zhich سوف تضع النص في منتصف داخل القبض.

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

كان لي مشكلة مماثلة لفترة & أستطيع أن أقول لك هذا الأسلوب يعمل...

مناقشة أكثر اكتمالا من مطبات باستخدام التعابير المنطقية للعثور على مطابقة الكلمات يمكن الاطلاع على: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi.ولا سيما أن تدرك أن تداخل الكلمات حقا بحاجة كامل المحلل في تفسير بشكل صحيح.

علما بأن حالة حساسية سوف تحتاج إلى إيقاف من أجل الإجابة على السؤال كما ذكر.في بيرل ، أن أنا التعديل:

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

الخدعة الأخرى هو استخدام *? الكمية التي يتحول قبالة الطمع من القبض على المباراة.على سبيل المثال, إذا كان لديك غير مطابقة [end] العلامة:

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

ربما كنت لا تريد التقاط:

 Data i want [End] Data

في حين يمكنك استخدام تعبير عادي تحليل البيانات بين فتح وإغلاق علامات تحتاج إلى التفكير مليا حول ما إذا كان هذا هو المسار الذي تريد أن تذهب إلى أسفل.والسبب في ذلك هو احتمال من فئة إلى العش:إذا تداخل العلامات يمكن أن يحدث أو قد يحدث من أي وقت مضى ، واللغة هي قال أن لا تكون منتظمة و التعبيرات العادية تتوقف عن ان تكون السليم أداة تحليل ذلك.

العديد من التعبير العادي تطبيقات مثل PCRE أو perl التعابير العادية ، دعم التراجع التي يمكن استخدامها لتحقيق هذا الخام تأثير.ولكن PCRE (على عكس بيرل) لا دعم غير محدود التراجع, وهذا يمكن أن يسبب في الواقع الأمور إلى كسر في طرق غريبة في أقرب وقت لديك الكثير من العلامات.

هناك ذكر بلوق وظيفة أن يناقش هذا أكثر من ذلك ، http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (جوجل و التحقق من ذاكرة التخزين المؤقت حاليا, يبدو أنهم يواجهون بعض التوقف)

حسنا, إذا كنت تضمن أن كل بداية الوسم تليها نهاية الوسم ثم بعد العمل.

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

ومع ذلك, إذا كان لديك النص المعقدة مثل follwoing:

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

ثم هل واجهت مشاكل مع regex.

الآن المثال التالي سيتم سحب كل الساخن الروابط في الصفحة:

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

في الحالة المذكورة أعلاه يمكننا أن نضمن أنه لن يكون هناك أي تداخل حالات:

'<a></a>'

هكذا, هذا هو سؤال معقد و لا يمكن فقط أن تحل مع إجابة بسيطة.

مع بيرل يمكنك تحيط البيانات التي تريدها مع ()'s سحبه في وقت لاحق ، وربما لغات أخرى لديها ميزة مشابهة.

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
}

يشير هذا السؤال إلى سحب النص بين علامات مع الفضاء الشخصيات النقاط (.)

[\S\s] هو اعتدت

Regex لتتناسب مع أي شخصية بما في ذلك خطوط جديدة

قراءة النص بين قوسين معقوفين [] أي[بداية] و [نهاية] و صحة مجموعة مع قائمة من القيم. 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top