# Rückwärtssuche mit RegEx?



## Dexxter (27. Juli 2006)

Hallo, 

ich habe folgendes Problem. Ich möchte um einen Suchbegriff (Text) herum eine Zeile einer HTML-Tabelle matchen (möchte in später bei Perl in ein Array ablegen). 

Da immer mit *<TD>* eingeleitet und mit *</TD>* abgeschlossen wird, dachte ich, es wäre recht einfach. 

Mein Regulärer Ausdruck lautet: 


```
<TR.*?>(Anzahl der Seitenimpressionen).*?</TR>
```
 Er findet damit zwar das erste *</TR>*, was meinem Text folgt, aber bei der Suche nach dem *<TR>* findet er nicht das erste vor meinem Text, sondern das erste im gesamten Dokument. 

Irgendwelche Vorschläge? Gibt es eine Möglichkeit -- ausser den Lookaheads und Lookbehinds, die ja keine Multiplikatoren zulassen -- eine First-Match-Suche nach links laufen zu lassen? 

Text: 


```
<!-- ----------------- Table: Allgemeine Statistik  ------------- -->

<P>

<CENTER><TABLE BORDER=1 CELLSPACING=0 WIDTH=90%>
<TR BGCOLOR="FFDD00">
<TD COLSPAN=2 ROWSPAN=1 NOWRAP><FONT SIZE=+1 FACE="Arial" COLOR="000000">
    <CENTER><B>Allgemeine Statistik </FONT><br><FONT SIZE=-2></FONT></B></CENTER>
</TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Datum und Uhrzeit der Berichterstellung</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">Mittwoch Januar 04, 2006 - 13.10.14</FONT></TD>

</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Zeitspanne</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">01.12.05 00.00.00 - 31.12.05 23.59.59</FONT></TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der Hits auf Homepage</B></FONT></TD>
<TD  ALIGN ="LEFT" >

    <FONT SIZE=2 FACE="Arial" COLOR="000000">35,738</FONT></TD>
</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der erfolgreichen Hits auf die gesamte Site</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">40,274,354</FONT></TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der Seitenimpressionen</B></FONT></TD>

<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">6,292,185</FONT></TD>
</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der Anwendersitzungen</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">578,312</FONT></TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >

    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anwendersitzungen aus Deutschland</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">42.25%</FONT></TD>
</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Internationale Anwendersitzungen</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">51.16%</FONT></TD>

</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anwendersitzungen mit unbekanntem Herkunftsland</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">6.58%</FONT></TD>
</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Mittlere Anzahl an Hits pro Tag</B></FONT></TD>
<TD  ALIGN ="LEFT" >

    <FONT SIZE=2 FACE="Arial" COLOR="000000">1,299,172</FONT></TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Mittlere Anzahl an Seitenimpressionen pro Tag</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">202,973</FONT></TD>
</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Mittlere Anzahl an Anwendersitzungen pro Tag</B></FONT></TD>

<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">18,655</FONT></TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Mittlere Länge einer Anwendersitzung</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">00:03:35</FONT></TD>
</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >

    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der eindeutigen Besucher</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">392,654</FONT></TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der Besucher, die nur einmal kamen</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">344,781</FONT></TD>

</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der Besucher, die mehrmals kamen</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">47,873</FONT></TD>
</TR>
</TABLE>
</CENTER>
<br><br>
```
Auf Rot und Blau wird gematcht. Es soll aber so gematcht werden: 


```
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der Seitenimpressionen</B></FONT></TD>

<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">6,292,185</FONT></TD>
</TR>
```


----------



## Gumbo (27. Juli 2006)

Probier mal folgenden regulären Ausdruck:
	
	
	



```
<TR[^>]*>(Anzahl der Seitenimpressionen).*?</TR>
```


----------



## GarGod (27. Juli 2006)

Hi probier mal



```
<TR[^>](*)>(Anzahl der Seitenimpressionen).(*)?$</TR>
```


----------



## Dexxter (31. Juli 2006)

Bin nun anders an die Sache herangegangen. Mein RegEx sieht nun so aus: 


```
Anzahl der Anwendersitzungen(.*?</TD>)(<TD.*?>)(.*?<.*?>)(.*?)(</.*?TD>)
```
Im Grunde brauch ich nur die Beschreibung und den Wert, da ich dies mit Perl später in eine Textdatei schreiben möchte. 

Folgendes Problem: Auf das, worauf ich mit (.*?<.*?>) matche, ist im HTML-Dokument der FONT-Tag. Da dieser nicht immer auftauchen muss, habe ich mir gedacht, ich setze ein *?* dahinter, also so: 


```
(.*?<.*?>)?
```
 Er soll dann meinen Wert (im orangen Pattern) matchen, egal, ob ein FONT-Tag vorhanden ist oder nicht. 

-------------------- 

Ohne *?*: 

Anzahl der Anwendersitzungen</B></FONT></TD><TD  ALIGN ="LEFT" >    <FONT SIZE=2 FACE="Arial" COLOR="000000">578,312</FONT></TD> 

So ist es im Prinzip in Ordnung, aber nun muss ein FONT-Tag vorhanden sein (zumindest: leer, "<>"). 

-------------------- 

Mit *?*: 

Anzahl der Anwendersitzungen</B></FONT></TD><TD  ALIGN ="LEFT" >    <FONT SIZE=2 FACE="Arial" COLOR="000000">578,312</FONT></TD> 

Hierbei verschluckt er nun meinen Wert im purpurfarbenen Pattern.


----------



## Gumbo (31. Juli 2006)

Wenn es sich bei dem „Wert“-Format immer um eine Zahl handelt, könntest du folgenden regulären Ausdruck verwenden:
	
	
	



```
(Anzahl der Anwendersitzungen).*?([0-9,]+)
```
Sind es jedoch auch noch andere Formate (etwa normale Zeichenketten), solltest du vielleicht erst einmal die HTML-Tags entfernen.


----------

