parsing - Regex: Um ein Sub herauszuziehen

Translate

Ich habe eine Datei im folgenden Format:

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

Ich würde mir gerne das schnappenData I wantvon zwischen dem[Start]und[End]Tags mit einem Regex. Kann mir jemand zeigen, wie das gemacht werden könnte?

This question and all comments follow the "Attribution Required."

Alle Antworten

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

Dies sollte hoffentlich die fallen lassen[start]und[end]Marker auch.

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

Zhich wird den Text in der Mitte eines Captures platzieren.

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

Ich hatte eine Weile ein ähnliches Problem und ich kann Ihnen sagen, dass diese Methode funktioniert ...

Quelle
Translate

Eine ausführlichere Beschreibung der Fallstricke bei der Verwendung eines regulären Ausdrucks zur Suche nach passenden Tags finden Sie unter:http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi. Beachten Sie insbesondere, dass Verschachtelungs-Tags wirklich einen vollwertigen Parser benötigen, um richtig interpretiert zu werden.

Beachten Sie, dass die Groß- und Kleinschreibung deaktiviert werden muss, um die angegebene Frage zu beantworten. In Perl ist das dasiModifikator:

$ 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 die Verwendung der*?Quantifizierer, der die Gier des erfassten Spiels ausschaltet. Zum Beispiel, wenn Sie eine nicht übereinstimmende haben[Ende]Etikett:

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

Sie möchten wahrscheinlich nicht erfassen:

 Data i want [End] Data
Quelle
Translate

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 und gründlich darüber nachdenken, ob dies ein Pfad ist, den Sie beschreiten möchten. Der Grund dafür ist das Potenzial von Tags zum Verschachteln: Wenn Verschachtelungs-Tags jemals auftreten könnten oder jemals auftreten könnten, wird die Sprache als nicht mehr regulär bezeichnet, und reguläre Ausdrücke sind nicht mehr das richtige Werkzeug zum Parsen.

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

Es gibt einen sehr häufig zitierten Blog-Beitrag, in dem dies mehr diskutiert wird.http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html(google danach und überprüfe den Cache, sie scheinen Ausfallzeiten zu haben)

Quelle
Translate

Wenn Sie garantieren, dass auf jedes Start-Tag ein End-Tag folgt, funktioniert Folgendes.

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

Wenn Sie jedoch komplexen Text wie den folgenden haben:

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

dann würden Sie auf Probleme mit Regex stoßen.

Im folgenden Beispiel werden nun alle Hotlinks auf einer Seite angezeigt:

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

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

'<a></a>'

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

Quelle
Translate

Mit Perl können Sie die gewünschten Daten mit () umgeben und später abrufen. Möglicherweise 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
}
Quelle
Translate

Beziehen Sie sich auf diese Frage, um Text zwischen Tags mit Leerzeichen und Punkten herauszuziehen (.)

[\S\s]ist der, den ich benutzt habe

Regex für jedes Zeichen, einschließlich neuer Zeilen

Quelle
Translate

Lesen Sie den Text in den eckigen Klammern [], dh [Start] und [Ende], und validieren 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;
}
Quelle