2016-05-11 11 views
1

Ich bin neu in Regex und ich benutze Perl.passende zwei Zeichen mit mehreren Zeilen dazwischen

Ich habe unten tag:

<CFSC>cfsc_service=TRUE 
SEC=1 
licenses=10 
expires=20170511 
</CFSC> 

ich etwas zwischen <CFSC> und </CFSC> Tags übereinstimmen soll.

Ich versuchte /<CFSC>.*?\n.*?\n.*?\n.*?\n<\/CFSC>/ und /<CFSC>(.*)<\/CFSC>/ aber hatte kein Glück.

+0

Willkommen bei Stack-Überlauf und der Perl-Tag. Bitte nimm dir einen Moment Zeit, um die [Tour] zu besuchen, um zu erfahren, wie man diese Seite benutzt. :) – simbabque

+0

Sicher. Danke :) –

Antwort

3

Sie benötigen die /ssingle line modifier die Regex-Engine umfassen Zeilenumbrüche in . zu machen.

Behandle Zeichenfolge als einzelne Zeile. Das heißt, ändern "." um jedem beliebigen Charakter zu entsprechen, sogar einem Zeilenumbruch, der normalerweise nicht zusammenpassen würde.

Siehe dieses Beispiel.

my $foo = qq{<CFSC>cfsc_service=TRUE 
SEC=1 
licenses=10 
expires=20170511 
</CFSC>}; 

$foo =~ m{>(.*)</CFSC>}s; 

print $1; 

Sie müssen auch ein anderes Trennzeichen als / verwenden, oder es zu entkommen.

+0

Danke, ich habe die Antwort bekommen. –

1

Versuchen

/<CFSC>(.*)<\/CFSC>/s 

Der letzte s die . Spiel Newline Zeichen macht (\n = 0x0a), die in der Regel ist nicht übereinstimmt:

Treat String als einzelne Zeile. Das heißt, ändern "." passend zu jedem Zeichen , auch eine Newline, die normalerweise nicht übereinstimmen würde.

von http://perldoc.perl.org/perlre.html#Modifiers

0

Versuchen Sie folgendes:

$foo =~ m/<CFSC>((?:(?!<\/CFSC>).)*)<\/CFSC>/gs; 

Modifikatoren:

 g - Matches global 
     s - newline 
     i - case sensitive 
     \ - escape sequence 
Verwandte Themen