Regex:Um einen Teilstring zwischen zwei Tags in einem String herauszuziehen

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

  •  08-06-2019
  •  | 
  •  

Frage

Ich habe eine Datei im folgenden Format:

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

Ich würde mir das gerne schnappen Data I want von zwischen den [Start] Und [End] Tags mithilfe eines Regex.Kann mir jemand zeigen, wie das gemacht werden könnte?

War es hilfreich?

Lösung

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

Dies sollte hoffentlich das Fallenlassen [start] Und [end] auch Markierungen.

Andere Tipps

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

Zhich wird den Text in der Mitte einer Aufnahme platzieren.

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

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

Eine ausführlichere Diskussion der Fallstricke bei der Verwendung eines regulären Ausdrucks zum Finden passender Tags finden Sie unter: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi.Beachten Sie insbesondere, dass verschachtelte Tags wirklich einen vollwertigen Parser benötigen, um richtig interpretiert zu werden.

Beachten Sie, dass die Groß-/Kleinschreibung deaktiviert werden muss, um die Frage wie angegeben zu beantworten.In Perl ist das das ich 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 besteht darin, das zu verwenden *? Quantifizierer, der die Gier des erfassten Treffers ausschaltet.Zum Beispiel, wenn Sie eine Nichtübereinstimmung haben [Ende] Etikett:

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

Sie möchten wahrscheinlich nicht erfassen:

 Data i want [End] Data

Während Sie einen regulären Ausdruck verwenden können, um die Daten zwischen öffnenden und schließenden Tags zu analysieren, müssen Sie lange und gründlich darüber nachdenken, ob Sie diesen Weg einschlagen möchten.Der Grund dafür ist die Möglichkeit der Verschachtelung von Tags:Wenn es jemals zu einer Verschachtelung von Tags kommen könnte oder kommen könnte, 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. PCRE oder die regulären Ausdrücke von Perl, unterstützen Backtracking, mit dem dieser grobe Effekt erzielt werden kann.Aber PCRE unterstützt (im Gegensatz zu Perl) kein unbegrenztes Backtracking, und das 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, der dies ausführlicher behandelt: http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (Googeln Sie danach und überprüfen Sie derzeit den Cache. Es scheint, dass sie einige Ausfallzeiten haben.)

Nun, wenn Sie garantieren, dass auf jedes Start-Tag ein End-Tag folgt, würde Folgendes funktionieren.

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

Wenn Sie jedoch komplexen Text wie den folgenden haben:

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

dann würden Sie Probleme mit Regex bekommen.

Das folgende Beispiel ruft nun alle Hotlinks auf einer Seite ab:

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

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

'<a></a>'

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

Mit Perl können Sie die gewünschten Daten mit ()s umgeben und sie 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
}

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

[\S\s] ist die, die ich verwendet habe

Regex zur Übereinstimmung mit jedem Zeichen, einschließlich neuer Zeilen

Lesen Sie den Text mit [] in den eckigen Klammern, d. h. [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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top