2015-08-18 11 views
7

Jede Seite von Wikipedia:Java regex Wie finde ich die Elternübereinstimmung?

... 
abas asdn asf asfs af 
{{Template1 
|a = Name surname 
|b = jhsdf sdf 
|c = {{Template2}} 
|d = 
|e = [[f]] and [[g]] 
|h = asd asdasfgasgasg asgas jygh trdx dftf xcth 
|i = 73 
|j = {{Template2|abc|123}} 
|j = {{Template3|aa=kkk|bb={{Template4|cc=uu}}}} 
}} 

asd wetd gdsgwew g 

{{OtherTemplate 
|sdf = 213 
}} 
... 

Wie finde ich Template1 ‚s Inhalt (Beginn ist |a Ende ist }}) mit Java regulären Ausdrücke?

Ich habe versucht:

String pattern = "\\{\\{\\s*Template1\\s*(.*?)\\}\\}"; 

Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
Matcher m = p.matcher(content); 

while (m.find()) { 
    if (!m.group().equals("")) { 
     System.out.println(m.group()); 
     System.out.println("-----------------------"); 
    } 
} 

Aber hier in der regex die erste }} findet (was Template2}}) hält dann an.
Ich möchte }} übergeben ist jede {{ ist offen. Dann möchte ich Top-Eltern-Match finden.

Ich möchte nach oben Template1 Inhalt zwischen oben {{ und }}?.

EDIT:

Bitte beachten Sie, dass ich content bin Parsen nach weißen Flecken zu entfernen.

content.replaceAll("\\s+",""); 

Denken Sie an Inhalt als Schreiben einer einzelnen Zeile.

+3

Verwenden Sie 'Jsoup' api. Einfacher als das Schreiben von Regex – TheLostMind

+0

Es wird dringend davon abgeraten, reguläre Ausdrücke zu verwenden, um Markup oder irgendetwas mit einer hierarchischen Grammatik zu analysieren. Verwenden Sie Ihren eigenen Parser oder jedes verfügbare Produkt (siehe auch den Kommentar von TheLostMind). – Mena

+0

@TheLostMind ist nicht jsoup HTML-Parser? Wie kann ich "{{" mit "jsoup" analysieren – MarsPeople

Antwort

0
\\{\\{\\s*Template1\\s*(.*?)\\n\\}\\} 

         ^^ 

Fügen Sie einfach \n ein. Siehe Demo.

https://regex101.com/r/uF4oY4/72

+0

Es ist nicht funktionieren, wenn die letzte Zeile | j = {{Template3 | aa = kkk | bb = {{Template4 | cc = uu}}}}}} – MarsPeople

1

/^{{Template1(.*?)^}}/sm

kehrt:

|a = Name surname 
|b = jhsdf sdf 
|c = {{Template2}} 
|d = 
|e = [[f]] and [[g]] 
|h = asd asdasfgasgasg asgas jygh trdx dftf xcth 
|i = 73 
|j = {{Template2|abc|123}} 
|j = {{Template3|aa=kkk|bb={{Template4|cc=uu}}}} 

https://regex101.com/r/qC6cM1/1 (DEMO)

+0

ist Es funktioniert nicht, wenn die Whitespaces entfernt werden, wenn die Zeile in "| j = {{Template3 | aa = kkk | bb = {{Template4 | cc = uu}}}}}}" geändert wird. – MarsPeople

+0

Ich verstehe nicht, was Sie sagen - Was ist mit Leerzeichen? –

+0

Wenn Sie "Template1" schließendes Tag "}}" zum Ende der "| j" Zeile verschieben, funktioniert diese Regex nicht. (Whitespace: Wenn Sie alle Zeilenumbrüche entfernen, erstellen Sie eine Zeile mit dem gesamten Inhalt) – MarsPeople

0

denke ich Parser besser jub in diesem Fall tun würde, aber wenn Sie regex wollen, wie etwa dieses:

{{Template1(?:[^{}]*?(?:{{[^}]+?}}))+(?:[}\n\s]+})* 

DEMO

ich davon aus, dass Sie Ihre Eingabe wie einzelne Zeile ist.

+0

das funktioniert nicht wenn das letzte}} Umzug zu Newline: Wie: https://regex101.com/r/eL5fR0/3 – MarsPeople

+0

@ Kumul und dieses: [demo] (https://regex101.com/r/eL5fR0/4). es ist ein wenig verändert –

+0

hey es sieht gut aus. Ich versuche nach Fehlern. Wenn es ohne Bug funktioniert, werde ich die Antwort akzeptieren. Gib mir etwas Zeit für Versuche. – MarsPeople

Verwandte Themen