Seite 1 von 1

RegEx Frage

Verfasst: 12.07.2008 14:40
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 ;)

Verfasst: 12.07.2008 14:54
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

Re: RegEx Frage

Verfasst: 12.07.2008 15:44
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)

Verfasst: 12.07.2008 15:49
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 :)