Seite 1 von 2

Hilfe bei regulärem Ausdruck

Verfasst: 15.07.2014 14:10
von Kiffi
Hallo,

ich benötige Hilfe bei einem regulären Ausdruck.

Aus einer Zeichenkette soll 'DasHierBraucheIch' ermittelt werden.

'SchluesselWort' steht immer am Anfang einer Zeile. Allerdings können auch WhiteSpaces davor stehen.

Code: Alles auswählen

SchluesselWort("DasHierBraucheIch")
  SchluesselWort("DasHierBraucheIch") ; evtl. ein Kommentar
Wenn 'SchluesselWort' auskommentiert ist, soll es nicht gefunden werden:

Code: Alles auswählen

; SchluesselWort("DasHierBraucheIch")
;  SchluesselWort("DasHierBraucheIch") ; evtl. ein Kommentar
 ;  SchluesselWort("DasHierBraucheIch") ; evtl. ein Kommentar
Das hier habe ich bisher. Allerdings wird hier nur die gesamte Zeile zurückgeliefert (und nicht nur 'DasHierBraucheIch').

Code: Alles auswählen

Define MeinString.s

MeinString + "" + #CRLF$
MeinString + "SchluesselWort(" + Chr(34) + "DasHierBraucheIch" + Chr(34) + ") ; evtl. ein Kommentar" + #CRLF$
MeinString + "  SchluesselWort(" + Chr(34) + "DasHierBraucheIch" + Chr(34) + ")" + #CRLF$
MeinString + "; SchluesselWort(" + Chr(34) + "DasHierBraucheIch" + Chr(34) + ")" + #CRLF$
MeinString + "  ; SchluesselWort(" + Chr(34) + "DasHierBraucheIch" + Chr(34) + ") ; evtl. ein Kommentar" + #CRLF$
MeinString + "" + #CRLF$

If CreateRegularExpression(0, "^[\s]*SchluesselWort\(['" + Chr(34) + "](.*?)['" + Chr(34) + "]\)", #PB_RegularExpression_MultiLine | #PB_RegularExpression_NoCase)
	If ExamineRegularExpression(0, MeinString)
		While NextRegularExpressionMatch(0)
			Debug RegularExpressionMatchString(0)
		Wend
	EndIf
EndIf
Danke im voraus & Grüße ... Kiffi

Re: Hilfe bei regulärem Ausdruck

Verfasst: 15.07.2014 14:40
von Bisonte
ich habe immer noch probleme diese kryptischen Ausdrücke zu verstehen. Also mache ich mal Hausfrauenlogikmäßig das mal mit Stringoperationen.
Es MUSS ja mit einem Chr(34) enden, also

Code: Alles auswählen

Define MeinString.s
Define h.s, a

MeinString + "" + #CRLF$
MeinString + "SchluesselWort(" + Chr(34) + "DasHierBraucheIch" + Chr(34) + ") ; evtl. ein Kommentar" + #CRLF$
MeinString + "  SchluesselWort(" + Chr(34) + "DasHierBraucheIch" + Chr(34) + ")" + #CRLF$
MeinString + "; SchluesselWort(" + Chr(34) + "DasHierBraucheIch" + Chr(34) + ")" + #CRLF$
MeinString + "  ; SchluesselWort(" + Chr(34) + "DasHierBraucheIch" + Chr(34) + ") ; evtl. ein Kommentar" + #CRLF$
MeinString + "" + #CRLF$

If CreateRegularExpression(0, "^[\s]*SchluesselWort\(['" + Chr(34) + "](.*?)['" + Chr(34) + "]\)", #PB_RegularExpression_MultiLine | #PB_RegularExpression_NoCase)
   If ExamineRegularExpression(0, MeinString)
      While NextRegularExpressionMatch(0)
        h = Mid(RegularExpressionMatchString(0), FindString(RegularExpressionMatchString(0), Chr(34), 1) + 1)
        h = ReverseString(h) : a = FindString(h, Chr(34), 1) : h = ReverseString(h)
        If a > 0 : h = Left(h, Len(h) - a) : EndIf
        Debug h
      Wend
   EndIf
EndIf 
zeigt zumindest in diesem content das richtige ergebnis, nehme ich an.
Ansonsten kann ich mir nur noch vorstellen, mit einer zweiten CreateRegularExpression() das : "DasHierBraucheIch" herauszuholen.
nachdem man die Leerzeichen eleminiert hat.

Re: Hilfe bei regulärem Ausdruck

Verfasst: 15.07.2014 14:50
von Kiffi
Hallo Bisonte,

danke für Deine schnelle Hilfe! Ich bin ja auch eher einer, der mit Hausfrauen-Logik ( :allright: ) unterwegs ist. Mit Stringoperationen wäre das schnell erledigt.

Allerdings wollte ich in diesem Fall das Problem mit einem regulären Ausdruck gelöst haben. Dieses 'lookbehind assertion', welches ich eigentlich anwenden will, raubt mir noch den letzten Nerv. :|

Grüße ... Kiffi

Re: Hilfe bei regulärem Ausdruck

Verfasst: 15.07.2014 16:19
von edel
Ich hoffe ich hab dich richtig verstanden

Code: Alles auswählen

Define MeinString.s

MeinString + "" + #CRLF$
MeinString + "SchluesselWort(" + Chr(34) + "DasHierBraucheIch" + Chr(34) + ") ; evtl. ein Kommentar" + #CRLF$
MeinString + "  SchluesselWort(" + Chr(34) + "DasHierBraucheIch" + Chr(34) + ")" + #CRLF$
MeinString + "; SchluesselWort(" + Chr(34) + "DasHierBraucheIch" + Chr(34) + ")" + #CRLF$
MeinString + "  ; SchluesselWort(" + Chr(34) + "DasHierBraucheIch" + Chr(34) + ") ; evtl. ein Kommentar" + #CRLF$
MeinString + "" + #CRLF$

If CreateRegularExpression(0, "^[\s]*SchluesselWort\(['" + Chr(34) + "](.*?)['" + Chr(34) + "]\)", #PB_RegularExpression_MultiLine | #PB_RegularExpression_NoCase)
   If ExamineRegularExpression(0, MeinString)
      While NextRegularExpressionMatch(0)
         Debug RegularExpressionGroup(0, 1)
      Wend
   EndIf
EndIf

Re: Hilfe bei regulärem Ausdruck

Verfasst: 15.07.2014 20:56
von Bisonte
@edel: Gut dass Du erwähnt hast, dass dafür PB5.3 gebraucht wird ;)

Re: Hilfe bei regulärem Ausdruck

Verfasst: 15.07.2014 21:11
von Kiffi
Good guy edel! Funktioniert bestens. Danke! :allright:

@Bisonte: 5.3 passt schon :)

Grüße ... Kiffi

Re: Hilfe bei regulärem Ausdruck

Verfasst: 15.07.2014 21:13
von edel
Ach, 5.30 ist noch gar nicht draussen? :bounce:

Code: Alles auswählen

ImportC ""
  pb_pcre_exec(*pcre, *extra, subject.p-ascii, length, startoffset, options, *ovector, ovecsize)
  pb_pcre_get_substring(subject.p-ascii, *ovector, stringcount, stringnumber, *stringptr)
  pb_pcre_free_substring(*stringptr)
EndImport

Define MeinString.s

MeinString + "" + #CRLF$
MeinString + "SchluesselWort(" + Chr(34) + "DasHierBraucheIch1" + Chr(34) + ") ; evtl. ein Kommentar" + #CRLF$
MeinString + "  SchluesselWort(" + Chr(34) + "DasHierBraucheIch2" + Chr(34) + ")" + #CRLF$
MeinString + "; SchluesselWort(" + Chr(34) + "DasHierBraucheIch3" + Chr(34) + ")" + #CRLF$
MeinString + "  ; SchluesselWort(" + Chr(34) + "DasHierBraucheIch4" + Chr(34) + ") ; evtl. ein Kommentar" + #CRLF$
MeinString + "" + #CRLF$


pattern.s = "^[\s]*SchluesselWort\(['" + Chr(34) + "](.*?)['" + Chr(34) + "]\)"
len = Len(MeinString)

Dim ovec(99)

regex = CreateRegularExpression(#PB_Any, pattern, #PB_RegularExpression_MultiLine | #PB_RegularExpression_NoCase)

While pb_pcre_exec(PeekI(regex), 0, MeinString, len, offset, 0, @ovec(), 30) > 0
  
  pb_pcre_get_substring(MeinString, ovec(), len, 1, @stringptr) ; first sub
  Debug PeekS(stringptr, -1, #PB_UTF8)
  pb_pcre_free_substring(stringptr)  
    
  offset = ovec(1)
Wend


Re: Hilfe bei regulärem Ausdruck

Verfasst: 15.07.2014 21:19
von Derren
Bisonte hat geschrieben:@edel: Gut dass Du erwähnt hast, dass dafür PB5.3 gebraucht wird ;)
Habe 5.22 LTS und ExamineRegularExpression() ist keine Funktion bei mir... Du und Kiffi benutzt die Funktion aber. Irgendwas stimmt doch hier nicht...

Re: Hilfe bei regulärem Ausdruck

Verfasst: 15.07.2014 21:47
von edel
Das ist eine Funktion aus 5.30 (Beta).

Verfasst: 16.07.2014 09:11
von CodeCommander
Derren hat geschrieben:
Bisonte hat geschrieben:@edel: Gut dass Du erwähnt hast, dass dafür PB5.3 gebraucht wird ;)
Habe 5.22 LTS und ExamineRegularExpression() ist keine Funktion bei mir... Du und Kiffi benutzt die Funktion aber. Irgendwas stimmt doch hier nicht...
Bisonte hat geschrieben:edel: Gut dass Du erwähnt hast, dass dafür PB5.3 gebraucht wird ;)
Du brauchst dafür 5.30 um die Funktion nutzen zu können.