Regex: Um eine Unterkette zwischen zwei Tags in einem String herausziehen

stimmen
42

Ich habe eine Datei in folgendem Format:

Deine Daten
Daten
[Anfang]
Daten Ich möchte
[Ende]
Daten

Ich möchte die greifen Data I wantzwischen den [Start]und [End]Tags ein Regex verwenden. Kann mir jemand zeigen , wie dies geschehen könnte?

Veröffentlicht am 04/08/2008 um 14:47
quelle vom benutzer
In anderen Sprachen...                            


9 antworten

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

Zhich'll legte den Text in der Mitte innerhalb einer Aufnahme.

Beantwortet am 04/08/2008 um 14:52
quelle vom benutzer

stimmen
22

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

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

Beantwortet am 04/08/2008 um 14:55
quelle vom benutzer

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

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

Beantwortet am 06/10/2012 um 17:52
quelle vom benutzer

stimmen
4

Während Sie einen regulären Ausdruck verwenden können, um die Daten zwischen Öffnen und Schließen-Tags zu analysieren, müssen Sie lange und hart denken, ob dies ist ein Weg, den Sie gehen möchten. Der Grund dafür ist das Potenzial von Tags zu verschachteln: Wenn Verschachtelung Tags jemals oder jemals passieren könnten passieren, wird die Sprache gesagt nicht mehr regelmäßig sein, und reguläre Ausdrücke nicht mehr das richtige Werkzeug, um es für die Analyse.

Viele regulären Ausdrücke Implementierungen, wie PCRE oder Perl reguläre Ausdrücke, Unterstützung Rückzieher, die verwendet werden können, um diese rauhe Wirkung zu erzielen. Aber PCRE (im Gegensatz zu Perl) unterstützt nicht unbegrenzt Rückzieher, und dies kann tatsächlich dazu führen, Dinge in seltsamer Weise zu brechen, sobald Sie haben zu viele Tags.

Es ist eine sehr häufig zitiert Blog - Post , die diese mehr diskutiert, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (für sie Google und den Cache prüfen zur Zeit, scheinen sie eine Auszeit zu haben)

Beantwortet am 15/09/2008 um 15:18
quelle vom benutzer

stimmen
4

: Eine vollständigere Erörterung der Gefahren eines regex passende Tags finden finden Sie unter http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . Insbesondere beachten Sie, dass Verschachtelung Tags wirklich ein vollwertiges Parser benötigen , um richtig zu interpretieren.

Beachten Sie, dass Groß- und Kleinschreibung benötigen , um die Frage zu beantworten , wie angegeben wird ausgeschaltet. In Perl, das ist 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 , die verwendet werden *? Quantifizierer die die greediness des erfassten Spiel wird ausgeschaltet. Zum Beispiel, wenn Sie einen nicht passenden [Ende] tag:

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

nicht erfassen möchten Sie wahrscheinlich:

 Data i want [End] Data
Beantwortet am 20/08/2008 um 20:14
quelle vom benutzer

stimmen
3

Nun, wenn Sie garantieren, dass jeder Start-Tag von einem End-Tag folgen dann dem folgende funktionieren würde.

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

Allerdings Wenn Sie komplexen Text wie der follwoing:

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

dann würden Sie Probleme mit Regex laufen.

Nun wird das folgende Beispiel ziehen alle heißen Links auf einer Seite:

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

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

'<a></a>'

Also, das ist eine komplexe Frage und kann nicht nur mit einer einfachen Antwort gelöst werden.

Beantwortet am 11/05/2009 um 21:08
quelle vom benutzer

stimmen
1

Mit Perl können Sie die Daten umgeben Sie mit () 's wollen und ziehen Sie es später, vielleicht andere Sprachen haben 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
}
Beantwortet am 04/08/2008 um 15:00
quelle vom benutzer

stimmen
0

Lesen Sie den Text mit in den eckigen Klammern [] , dh [Start] und [Ende] und das Array mit einer Liste von Werten validieren. 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;
}
Beantwortet am 12/09/2014 um 09:26
quelle vom benutzer

stimmen
0

Wenden Sie sich an diese Frage ziehen Text zwischen den Tags mit Leerzeichen und Punkte ( .)

[\S\s] I ist derjenige verwendet

Regex passen alle Zeichen einschließlich neuer Linien

Beantwortet am 28/08/2013 um 22:12
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more