Regex: Um eine Unterzeichenfolge zwischen zwei Tags in einer Zeichenfolge abzurufen

  • Ich habe eine Datei im folgenden Format:

     Daten Daten 
     Daten 
     [Start] 
     Ich möchte Daten 
     [Ende] 
     Daten 
     

    Ich möchte die Data I want zwischen den Tags [Start] und [End] mit einer Regex abrufen. Kann mir jemand zeigen, wie das gemacht werden könnte?

    14 September 2017
    Aditi ParikhDan
8 answers
  •  \[start\](.*?)\[end\]
     

    Sie legen den Text innerhalb einer Capture in die Mitte.

    18 September 2017
    YCF_L
  •  \[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]
     

    Dies sollte hoffentlich auch die Markierungen [start] und [end] löschen.

    18 September 2017
    YCF_L
  •  $text ="Data Data Data start Data i want end Data";
    ($content) = $text =~ m/ start (.*) end /;
    print $content;
     

    Ich hatte eine Weile ein ähnliches Problem. & amp; Ich kann Ihnen sagen, dass diese Methode funktioniert ...

    06 October 2012
    PhaZe
  • Eine umfassendere Diskussion der Fallstricke bei der Verwendung übereinstimmender Tags mit einem Regex finden Sie unter: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . Beachten Sie insbesondere, dass zum Verschachteln von Tags wirklich ein vollwertiger Parser erforderlich ist, um korrekt interpretiert zu werden.

    Beachten Sie, dass die Groß- / Kleinschreibung für die Antwort deaktiviert werden muss Frage wie angegeben. In Perl ist dies der i -Modifikator:

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

    Der andere Trick ist zu verwenden Der Quantifizierer *? , der die Gier des erfassten Matches deaktiviert. Wenn Sie zum Beispiel ein nicht passendes [end] -Tag haben:

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

    Sie möchten wahrscheinlich nicht erfassen:

      Data i want [End] Data
     
    20 August 2008
    Jon EricsonMax
  • Während Sie einen regulären Ausdruck verwenden können, um die Daten zwischen dem Öffnen und Schließen von Tags zu analysieren, müssen Sie lange überlegen, ob dies ein Pfad ist, den Sie gehen möchten. Der Grund dafür ist das Potenzial von Tags zum Verschachteln von Tags: Wenn verschachtelte Tags jemals passieren könnten oder jemals passieren könnten, wird gesagt, dass die Sprache nicht mehr regelmäßig ist und reguläre Ausdrücke nicht mehr das richtige Werkzeug für das Parsen sind.

    Viele Implementierungen regulärer Ausdrücke wie PCRE oder reguläre Ausdrücke von Perl unterstützen Backtracking, mit dem dieser grobe Effekt erzielt werden kann. Aber im Gegensatz zu Perl unterstützt PCRE kein unbegrenztes Backtracking. Dies kann dazu führen, dass Dinge auf seltsame Weise kaputt gehen, sobald Sie zu viele Tags haben.

    Es gibt einen sehr häufig zitierten Blogbeitrag, der dies ausführlicher bespricht noreferrer "> http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (google und prüfe den Cache, sie scheinen momentan eine Ausfallzeit zu haben)

    15 September 2008
    Daniel Papasian
  • Wenn Sie garantieren, dass auf jedes Start-Tag ein End-Tag folgt, würde Folgendes funktionieren:

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

    Wenn Sie jedoch einen komplexen Text wie den folgenden haben:

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

    , dann würden Sie dies tun Probleme mit regex haben.

    Nun werden im folgenden Beispiel alle Direktlinks auf einer Seite angezeigt:

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

    In dem obigen Fall können wir garantieren, dass es keine verschachtelten Fälle von

     '<a></a>'
     
    gibt

    Dies ist also eine komplexe Frage und kann nicht einfach mit einer einfachen Antwort gelöst werden.

    12 May 2009
    un33k
  • Mit Perl können Sie die gewünschten Daten mit () umgeben und später herausziehen, vielleicht haben andere Sprachen eine ähnliche Funktion.

     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
    }
     
    12 October 2008
    brian d foy
  • Lesen Sie den Text in den eckigen Klammern [], d. h. [Start] und [End], und überprüfen Sie das Array mit einer Liste von Werten. 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;
    }
     
    07 February 2016
    Markus SafarMHop