Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

hilfe bei Reguläre Ausdrücke



  • Please log in to reply
13 replies to this topic
mod147
  • Members
  • 6 posts
  • Last active: Mar 17 2013 08:22 AM
  • Joined: 14 Mar 2013
Hallo, ich weis es ist etwas frech, aber ich kann's nicht und mein altes Gehirn nimmt's nicht so einfach an.
Deshalb meine bitte an diejenigen die 'Reguläre Ausdrücke ' träumen.
 
Habe ein html sammelsurium indem diese zeilen Vorkommen. bis zu 400 mal
 
<td align="left"><a href="blablablablabla">brauch ich</a></td>    , enthält Buchstaben und Zahlen und Leerzeichen
            <td align="left">brauch ich</td>                                         , enthält Buchstaben und Zahlen und Leerzeichen
            <td align="left">brauch ich</td>                                         ,  Zahlen und : , kann leer sein
            <td align="left"><strong>brauch ich</strong></td>            , Zahlen und : , kann leer sein wenn leer, dann ohne "<strong></strong>"
            <td align="left">brauch ich</td>                                         , enthält Buchstaben und Zahlen und Leerzeichen, kann leer sein
            <td align="left">brauch ich</td>                                         , enthält Buchstaben und Zahlen und Leerzeichen, kann leer sein
 
zwischen den Zeilen kann eine beliebige Anzahl Leerzeichen, tabs etc. sein
 
kann mir das  Jemand in ein/zwei regex runterschreiben.
 
mfg
danke


nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Das ganze ist auch für uns gar nicht so einfach.

Dein Skript ist nicht gierig d.h.

 

Ungreedy (nicht gierig). Die Quantoren *+?{} verbrauchen so wenig Zeichen wie möglich für eine Übereinstimmung und lassen den Rest für den nächsten Teilausdruck übrig. Wenn die "U"-Option nicht aktiv ist, dann kann die Gier eines beliebigen Quantors mit einem nachfolgendem Fragezeichen aufgehoben werden. Wenn hingegen "U" aktiv ist, dann macht das Fragezeichen einen beliebigen Quantor gierig.

 

Dazu brauchst du dann noch die Folgenden Zeichen:

 

| Mit dem vertikalen Strich werden mehrere Alternativen abgegrenzt. Eine Übereinstimmung erfolgt, wenn eine beliebige Alternative zufrieden gestellt ist. Zum Beispiel stimmt gray|grey sowohl mit gray als auch grey überein. Ebenso bewirkt gr(a|e)y mithilfe der unten genannten Klammern das Gleiche.

 

(...)

Elemente in Klammern werden häufig verwendet, um:

  • die Reihenfolge der Auswertung zu bestimmen. Zum Beispiel stimmt (Sonn|Mon|Diens|Donners|Frei|Sams)tag|Mittwoch mit dem Namen jeden Tages überein.
  • *, ?, + oder {min,max} auf eine Reihe von Zeichen anstelle eines Zeichens anzuwenden. Zum Beispiel stimmt (abc)+ mit einem oder mehreren Vorkommen von "abc" überein, daher erfolgt eine Übereinstimmung mit abcabc123, aber nicht mit ab123 oder bc123.
  • einen Teilausdruck wie der Punkt-Stern in abc(.*)xyz einzufangen. Zum Beispiel speichert RegExMatch() den Teilstring, der mit jedem Teilausdruck übereinstimmt, in einem Ausgabe-Array. Ebenso kann RegExReplace() den Teilstring, der mit jedem Teilausdruck übereinstimmt, in das Ergebnis per Rückreferenz (z. B. $1) wieder einfügen. Damit die Klammern den Teilausdruck nicht einfangen, müssen die ersten beiden Zeichen innerhalb der Klammern ?: sein, zum Beispiel: (?:.*)

 

[...]

Zeichenklassen: Die eckigen Klammern umschließen eine Liste oder einen Bereich von Zeichen (oder beides). Zum Beispiel bedeutet [abc]: "jedes Zeichen, das entweder ein a, b oder c ist". Mit einem Bindestrich wird ein Bereich erzeugt, zum Beispiel bedeutet [a-z]: "jedes Zeichen von a bis z". Listen und Bereiche können kombiniert werden, zum Beispiel bedeutet [a-zA-Z0-9_]: "jedes Zeichen, das alphanumerisch oder ein Unterstrich ist".

Nach einer Zeichenklasse kann *, ?, + oder {min,max} erfolgen. Zum Beispiel stimmt [0-9]+ mit einem oder mehreren Vorkommen von Ziffern überein, daher erfolgt eine Übereinstimmung mit xyz123, aber nicht mit abcxyz.

Die folgenden POSIX-Sets werden auch in Form von [[:xxx:]] unterstützt, wobei xxx ein folgendes Wort sein kann: alnum, alpha, ascii (0-127), blank (Leerzeichen oder Tabulator), cntrl (Steuerzeichen), digit (0-9), xdigit (hexadezimale Ziffern), print, graph (print ohne Leerzeichen), punct, lower, upper, space (unsichtbare Zeichen), word (wie \w).

Innerhalb einer Zeichenklasse müssen die Zeichen nicht geschützt werden, es sei denn, sie haben eine besondere Bedeutung in der Klasse; z. B. [\^a], [a\-b], [a\]] und [\\a].

 

 

 

Das ganze sollte ähnlich dem hier aussehen:

Regexmatch(str,"U)texteins((alernative1|alternative2))?(.*)((alernative3|alternative4))?textende",ausgabe)

Visit the new forum ahkscript.org.

http://ahkscript.org


SAPlayer
  • Members
  • 403 posts
  • Last active: Apr 11 2014 04:45 PM
  • Joined: 06 Nov 2012

Sollte so funktionieren:

RegExMatch(deine_variable, "U)<td align=""left""><a href="".+"">(.*)</a></td>\s*<td align=""left"">(.+)</td>\s*<td align=""left"">([\d:]*)</td>\s*<td align=""left"">(<strong>)?([\d:]*)(</strong>)?</td>\s*<td align=""left"">(.*)</td>\s*<td align=""left"">(.*)</td>", regex) ;Wird in regex1, regex2 usw. gespeichert


strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012
x=
(
<td align="left"><a href="blablablablabla">brauch ich</a></td>    
            <td align="left">brauch ich</td>                                         
            <td align="left">brauch ich</td>                                         
            <td align="left"><strong>brauch ich</strong></td>          
            <td align="left">brauch ich</td>                                       
            <td align="left">brauch ich</td>                                        
)
needle:="<td align=""left"">(?:.*?>)?((?:\w| )+)(?:<.*?)?</td>"
;needle:="<td align=""left"">(?:<a href=.*?>|<strong>)?((?:\w| )+)(?:</a>|</strong>)?</td>" ; etwas genauer.
y:=0
while (y:=regexmatch(x,needle,match,y+1))
    msgbox,% match1

Regards,
Babba

nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012
"U)<td align=""left"">(?:<a href=".*"?>|<strong>)?((?:\w| )+)(?:</a>|</strong>)?</td>"

Sollte glaube ich  am besten funktionieren.


Visit the new forum ahkscript.org.

http://ahkscript.org


mod147
  • Members
  • 6 posts
  • Last active: Mar 17 2013 08:22 AM
  • Joined: 14 Mar 2013

x=
(
<td align="left"><a href="blablablablabla">brauch ich</a></td>    
            <td align="left">brauch ich</td>                                         
            <td align="left">brauch ich</td>                                         
            <td align="left"><strong>brauch ich</strong></td>          
            <td align="left">brauch ich</td>                                       
            <td align="left">brauch ich</td>                                        
)
needle:="<td align=""left"">(?:.*?>)?((?:\w| )+)(?:<.*?)?</td>"
;needle:="<td align=""left"">(?:<a href=.*?>|<strong>)?((?:\w| )+)(?:</a>|</strong>)?</td>" ; etwas genauer.
y:=0
while (y:=regexmatch(x,needle,match,y+1))
    msgbox,% match1
needle:="<td align=""left"">(?:.*?>)?((?:\w| )+)(?:<.*?)?</td>"

 

funzt soweit ganz gut, bekomme aber 2 Arrays, im ersten ist alles da was ich oben beschrieben habe,

nur im Ergebnis erhalte ich die 

<td align="left">

 

und auch den ganzen link.

wobei der link mit dem Wert ein Element des Arrays ist und die anderen 4 - 5 werte als ein weiteres Element zusammengelegt werden

 

ich brauche aber nur die werte zwischen >.......  < als je ein Element des Arrays.

 

ohne html td strong etc.

und im 2. Array  sind  nur die Werte der ersten Zeile und der fünften Zeile vorhanden

nochmal Danke für eure Bemühungen, für mich sind regex böhmische Bahnhöfe.

 

ach ja in meine heutigen Datei sind es 766 Ergebnisse, je 6 Zeilen 



strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012
x=

(

<td align="left"><a href="blablablablabla">brauch ich1</a></td>    

            <td align="left">brauch ich2</td>                                         

            <td align="left">brauch ich3</td>                                         

            <td align="left"><strong>brauch ich4</strong></td>          

            <td align="left">brauch ich5</td>                                       

            <td align="left">brauch ich6</td>                                        

)

;needle:="<td align=""left"">(?:.*?>)?((?:\w| )+)(?:<.*?)?</td>" ; ist kaputt.

needle:="<td align=""left"">(?:<a href=.*?>|<strong>)?((?:\w| )+)(?:</a>|</strong>)?</td>" ; etwas genauer.

txt:=""

y:=0

while (y:=regexmatch(x,needle,match,y+1))

    txt.=match1 "`n"

msgbox,% txt

vllt reicht bei dir auch schon ein unspezifisches

 

needle:=">((?:\w| )+)<"

Regards,
Babba

mod147
  • Members
  • 6 posts
  • Last active: Mar 17 2013 08:22 AM
  • Joined: 14 Mar 2013

x=

(

<td align="left"><a href="blablablablabla">brauch ich1</a></td>    

            <td align="left">brauch ich2</td>                                         

            <td align="left">brauch ich3</td>                                         

            <td align="left"><strong>brauch ich4</strong></td>          

            <td align="left">brauch ich5</td>                                       

            <td align="left">brauch ich6</td>                                        

)

;needle:="<td align=""left"">(?:.*?>)?((?:\w| )+)(?:<.*?)?</td>" ; ist kaputt.

needle:="<td align=""left"">(?:<a href=.*?>|<strong>)?((?:\w| )+)(?:</a>|</strong>)?</td>" ; etwas genauer.

txt:=""

y:=0

while (y:=regexmatch(x,needle,match,y+1))

    txt.=match1 "`n"

msgbox,% txt

vllt reicht bei dir auch schon ein unspezifisches

 

needle:=">((?:\w| )+)<"

nein, da bekomme ich den ganzen schrott  '>....<' der html Datei.

Wie gesagt der erste Ansatz war ja schon fast das was ich brauche, aber ich kann's nicht verfeinern confused.png



strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

Haste die obere code box getestet?


Regards,
Babba

mod147
  • Members
  • 6 posts
  • Last active: Mar 17 2013 08:22 AM
  • Joined: 14 Mar 2013
✓  Best Answer
funzt bei dem kleinen abschnitt.
 
gebe ich aber den ganzen html an dann kommt;
 
---------------------------
new.ahk
---------------------------
Error at line 1.
 
Line Text:         <tr>
Error: Continuation section too long.
 
The program will exit.
 
 
Fehlermeldung
 
 
eigentlich verwende ich den regex in php, aber da ich mich nicht in jedes Forum anmelden möchte und ich hier(altes Forum)  schon einige male sehr freundliche Unterstützung erhalten habe, was auch nicht überall selbstverständlich ist, dachte ich daran das diejenigen welche regex träumen mir evtl. helfen.
 
Is aber ok, melde mich wenn ich nun doch selber gelöst habe.
 
gruss
zoltan


strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

Error: Continuation section too long. (die war auch nur zur Demo, es ging ja auch um regex.)

 

fileread,x,dateipfad

Regards,
Babba

mod147
  • Members
  • 6 posts
  • Last active: Mar 17 2013 08:22 AM
  • Joined: 14 Mar 2013

Error: Continuation section too long. (die war auch nur zur Demo, es ging ja auch um regex.)

 

fileread,x,dateipfad

hier ist auch wieder so das nicht alle zeilen gelesen werden s.h. die zeilen mit : im wert  werden nicht gezeigt.

 

lass gut sein , danke nochmal



strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

jupp, die : hab ich übersehen.

 

needle:="<td align=""left"">(?:<a href=.*?>|<strong>)?((?:\w| |:)*)(?:</a>|</strong>)?</td>"

Regards,
Babba

mod147
  • Members
  • 6 posts
  • Last active: Mar 17 2013 08:22 AM
  • Joined: 14 Mar 2013

jupp, die : hab ich übersehen.

 

needle:="<td align=""left"">(?:<a href=.*?>|<strong>)?((?:\w| |:)*)(?:</a>|</strong>)?</td>"

cool; mit ahk + fileread + msgbox gehts nun wunderbar.

 

mal schaun ob ich das nun noch in mein php rein krieg

 

auch im php gehts aber immer noch 2 Arrays eins mit und eins ohne den tags