2016-04-17 3 views
1

Ich habe eine .rtf Datei, die viele fette Titel enthält. Ich versuche Daten zwischen zwei fett gedruckten Titeln zu erfassen. Die Tags, die verwendet werden, um etwas fett zu sagen, sind jedoch genau das gleiche Ende des Textes.RegEx zum Überspannen von zwei Zeilen, nur in der separaten Zeile

Also ich versuche, das Muster zu finden, das das fett markierte Tag auf der nächsten nächsten Zeile (und alles dazwischen) und nicht auf der gleichen Zeile erfassen wird. Ich benutze Java.

Beispieltext:

\par }{\b\f1\fs24\ul\insrsid14762702 Data}{\insrsid14762702 \tab \tab }{\b\f1\fs24 
\par Start:\tab 2015-01-14 10:56:25 
\par Duration:\tab 22:40:23 
\par Positions:\tab 3.0, 5.0, 7.0, 9.0, 15.0, 17.0 cm 
\par Sensor Position(s):\tab -10.0, 5.0 cm 
\par Depth:\tab N/A 
\par 
\par }{\b\f1\fs24 
\par }{\b\f1\fs24\ul\insrsid14762702 History}{\insrsid14762702 
\par Other 
{\b\f1\fs24\ul\insrsid14762702 

Was ich derzeit benutze:

((\\\\b\\\\f1\\\\fs24.+?\\{\\\\b\\\\f1\\\\fs24)) 

Die ganze Java Linie ist:

Pattern pattern = Pattern.compile("((\\\\b\\\\f1\\\\fs24.+?\\{\\\\b\\\\f1\\\\fs24))",Pattern.DOTALL); 

Was mir gibt:

\par }{\b\f1\fs24\ul\insrsid14762702 Data}{\insrsid14762702 \tab \tab }{\b\f1\fs24 

\par }{\b\f1\fs24 
    \par }{\b\f1\fs24 

{\b\f1\fs24\ul\insrsid14762702 History}{\insrsid14762702 
    \par Other 
    {\b\f1\fs24 

Die erwartete Ausgabe lautet:

\par }{\b\f1\fs24\ul\insrsid14762702 Data}{\insrsid14762702 \tab \tab }{\b\f1\fs24 
    \par Start:\tab 2015-01-14 10:56:25 
    \par Duration:\tab 22:40:23 
    \par Positions:\tab 3.0, 5.0, 7.0, 9.0, 15.0, 17.0 cm 
    \par Sensor Position(s):\tab -10.0, 5.0 cm 
    \par Depth:\tab N/A 
    \par 
    \par }{\b\f1\fs24 

Und:

\par }{\b\f1\fs24 
    \par }{\b\f1\fs24 

Und:

\par }{\b\f1\fs24\ul\insrsid14762702 History}{\insrsid14762702 
    \par Other 
    {\b\f1\fs24\ul\insrsid14762702 
+3

Was ist Ihre erwartete Ausgabe? – anubhava

Antwort

1

Sie 2 erfasst Gruppen für diese verwenden können. Eine zum Starten von Tag und Text bis zum End-Tag (die nicht in derselben Zeile sein sollte). Sie benötigen ein Lookahead, um überlappende Übereinstimmungen abgleichen zu können. Die zweite gefangene Gruppe wird im Lookahead sein.

Regex Sie verwenden können:

([^\n]*\Q{\b\f1\fs24\E[^\n]*\n.*?)(?=([^\n]*\Q{\b\f1\fs24\E)) 

RegEx Demo

PS: Hinweis Verwendung von Pattern.quote übermäßigen Entkommen zu vermeiden.

Code:

String text = "\\par }{\\b\\f1\\fs24\\ul\\insrsid14762702 Data}{\\insrsid14762702 \\tab \\tab }{\\b\\f1\\fs24\n\\par Start:\\tab 2015-01-14 10:56:25\n\\par Duration:\\tab 22:40:23\n\\par Positions:\\tab 3.0, 5.0, 7.0, 9.0, 15.0, 17.0 cm\n\\par Sensor Position(s):\\tab -10.0, 5.0 cm\n\\par Depth:\\tab N/A\n\\par \n\\par }{\\b\\f1\\fs24\n\\par }{\\b\\f1\\fs24\\ul\\insrsid14762702 History}{\\insrsid14762702 \n\\par Other \n{\\b\\f1\\fs24\\ul\\insrsid14762702";  
String tag = Pattern.quote("{\\b\\f1\\fs24"); 

Pattern p = Pattern.compile("([^\n]*" + tag + "[^\n]*\n.*?)(?=([^\n]*" + tag + "))", 
      Pattern.DOTALL); 

Matcher m = p.matcher(text); 

List<String> matches = new ArrayList<>(); 
while(m.find()) { 
    matches.add(m.group(1) + m.group(2)); 
} 

for (String s: matches) 
    System.err.println(s + "\n"); 

Ausgang:

\par }{\b\f1\fs24\ul\insrsid14762702 Data}{\insrsid14762702 \tab \tab }{\b\f1\fs24 
\par Start:\tab 2015-01-14 10:56:25 
\par Duration:\tab 22:40:23 
\par Positions:\tab 3.0, 5.0, 7.0, 9.0, 15.0, 17.0 cm 
\par Sensor Position(s):\tab -10.0, 5.0 cm 
\par Depth:\tab N/A 
\par 
\par }{\b\f1\fs24 

\par }{\b\f1\fs24 
\par }{\b\f1\fs24 

\par }{\b\f1\fs24\ul\insrsid14762702 History}{\insrsid14762702 
\par Other 
{\b\f1\fs24 
1

Sie benötigen mehrzeilige regex wie unten:

String text = "\\par }{\\b\\f1\\fs24\\ul\\insrsid14762702 Data}{\\insrsid14762702 \\tab \\tab }{\\b\\f1\\fs24\n" + 
"\\par Start:\\tab 2015-01-14 10:56:25\n" + 
"\\par Duration:\\tab 22:40:23\n" + 
"\\par Positions:\\tab 3.0, 5.0, 7.0, 9.0, 15.0, 17.0 cm\n" + 
"\\par Sensor Position(s):\\tab -10.0, 5.0 cm\n" + 
"\\par Depth:\\tab N/A\n" + 
"\\par \n" + 
"\\par }{\\b\\f1\\fs24\n" + 
"\\par }{\\b\\f1\\fs24\\ul\\insrsid14762702 History}{\\insrsid14762702 \n" + 
"\\par Other \n" + 
"{\\b\\f1\\fs24\\ul\\insrsid14762702"; 

Pattern pattern = Pattern.compile("(?mi)\\\\b(?<content>.*)\\\\b"); 
Matcher matcher = pattern.matcher(text); 

while(matcher.find()){ 
    String content = matcher.group("content"); 
    System.out.println("content: "+ content); 
} 
Verwandte Themen