RegEx Frage

Anfängerfragen zum Programmieren mit PureBasic.
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

RegEx Frage

Beitrag von PMTheQuick »

Hi all,

habe wieder mal eine Frage.... Und zwar zu RegEx. Nun, es geht um ein Sprachensystem... Ein String kann so aussehen:

Code: Alles auswählen

LANG[main_word] Hier ist es fix LANG[exit_word]
Folgende RegExpression erkennt diese Strings gezielt:

Code: Alles auswählen

CreateRegularExpression(1, ".*LANG\133.*\135.*")
(133 = oktal für [, 135 = oktal für ])

Dann benutze ich folgenden Code:

Code: Alles auswählen

If MatchRegularExpression(1, value$)
            Debug "MATCH"
            value$ = ReplaceRegularExpression(1, value$, "Sprachen noch nicht verfügbar!")
          EndIf
Dieser geht auch perfekt. Jetzt bei Sprachen noch nicht verfügbar will ich es durch: GetLang(LangName$). Nun meine Frage... Ich möchte das zwischen LANG[ und ] auslesen... Dass is dann der LangName, und der Rest geht einfach. Wie mache ich dies? Also würde oben rauskommen:

1. LangName: main_word
2. LangName: exit_word

Danke im vorraus für eure Antworten,

Gruss
PMTheQuick ;)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

ImportC ""
  pcre_exec(*pcre, *extra, subject.s, length, startoffset, options, *ovector, ovecsize)
  pcre_get_substring(subject.s, *ovector, stringcount, stringnumber, *stringptr)
  pcre_free_substring(*stringptr)
EndImport

subject.s = "LANG[main_word] Hier ist es fix LANG[exit_word]"
pattern.s = "LANG\[(.*?)\]"
len = Len(subject)
offset = 0
first_sub = 0
count = 0

Dim ovec(30)

regex = CreateRegularExpression(#PB_Any, pattern)

count = pcre_exec(PeekL(regex), 0, subject, len, offset, 0, @ovec(), 30)

While count>0
  
  pcre_get_substring(subject, ovec(), count, 1, @first_sub)
  
  Debug PeekS(first_sub)
    
  pcre_free_substring(first_sub)
  
  offset = ovec(1)
  count = pcre_exec(PeekL(regex), 0, subject, len, offset, 0, @ovec(), 30)
Wend
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: RegEx Frage

Beitrag von Danilo »

PMTheQuick hat geschrieben:Also würde oben rauskommen:

1. LangName: main_word
2. LangName: exit_word

Code: Alles auswählen

Procedure.s getWord(string.s, start.l=1)
  Define MainWord.s
  posStart.l = FindString(string,"LANG[",start)
  If posStart
    posEnd.l = FindString(string,"]",posStart+5)
    If posEnd
      MainWord = Mid(string,posStart+5,posEnd-posStart-5)
    Else
      ; missing ']'!
    EndIf
  EndIf
  ProcedureReturn MainWord
EndProcedure

#MAINWORD = 1
#EXITWORD = 5

A$="LANG[main_word] Hier ist es fix LANG[exit_word]"
A$="LANG[b] Hier ist es fix LANG[/b]"

Debug getWord(A$,#MAINWORD)
Debug getWord(A$,#EXITWORD)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag von PMTheQuick »

Danke für eure Antworten! Ich verwende jetzt edels Code, da ich wenn möglich keine Stringbefehle verwenden will... Trotzdem danke!

Gruss
PMTheQuick :)
Antworten