[BlitzMax] Erweitertes preg_replace

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

FWeinb

ehemals "ich"

Betreff: [BlitzMax] Erweitertes preg_replace

BeitragMo, Apr 05, 2010 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich in letzter Zeit oft bzw. viele Dateien Umbenennen musste welche schon nach einem System benannt waren, schrieb ich mir Kurzerhand eine Funktion um das mit dem RegExp Modul von Brucey zu machen. Es wird also das Modul Bah.RegEx (Download) benötigt. Mir ist bekannt, dass es die Funktion ReplaceAll(Target:String, replaceWith:String, startPos:Int = 0) schon gibt, doch brauchte ich eine etwas mächtigere Funktion.

Die besagte Funktion unterstützt zwar das Einsetzen von zuvor gefundenen subquery aber leider nicht das Manipulieren dieser.

Kurz zur Syntax meiner Funktion, anhand eines Beispiels:

BlitzMax: [AUSKLAPPEN]
Local Text:String = "Super cool [b]das[/b] ganze [b]hier[/b]"
Local SearchPattern:String = "\[b\](.*?)\[\/b\]"
Local ReplacePattern:String = "<b>$1</b>"

Print preg_replace(SearchPattern,ReplacePattern,Text)


Der String Text sollte selbsterklärend sein hier ist der zu bearbeitende Text enthalten.
Der String SearchPattern kann ein Regulärer Ausdruck nach dem allg. Standart sein.

Jetzt zum String ReplacePattern hier unterscheidet sich meine Funktion von der oben Genannten. Zum einen werden Parameter über das $(Dollar)-Zeichen eingesetzt. Wobei zu beachten ist, das $0 der gesamte Match und ab 1 die SubQuery's eingesetzt werden.

Wie ich am Anfang schon vermuten ließ ist es möglich den einzusetzenden String noch zu verändern. Hier gibt es drei Modifier welche dem $-Zeichen angehangen werden. Einmal das ^(Zirkumflex), welches das erste Zeichen im String großschreiben lässt. ( $^1 = <b>Das</b>)

Zum anderen gibt es noch das !(Ausrufezeichen) welches den gesamten String großschreiben lässt.( $!1 = <b>DAS</b>)

Zum Schluss noch eine sehr primitive Replace-Funktion,z u welcher ich auch noch ein Beispiel habe:

BlitzMax: [AUSKLAPPEN]
Local Text:String = "Super cool [b]das[/b] ganze [b]hier[/b]"
Local SearchPattern:String = "\[b\](.*?)\[\/b\]"
Local ReplacePattern:String = "<b>$(1,hier,NICHT)</b>"
Print preg_replace(SearchPattern,ReplacePattern,Text)


Zwar kann nützliches Beispiel, aber es veranschlaulicht was es tut. Nach dem $-Zeichen wird eine Klammer gemacht wobei die Parameter durch Kommata getrennt werden.
Der erste (im bsp. die 1) entspricht der Zahl für das SubQuery der 2te (im bsp. "hier") gibt den zu erstzenden String an und der 3te (im bsp. "NICHT") eben den String mit welche er ersetzt wird.

Das sind die Funktionen die ich für das Umbenennen brauchte, hoffe jemand kann die Funktion gebrauchen.


BlitzMax: [AUSKLAPPEN]
Function preg_replace:String(Pattern:String, ReplaceString:String, SearchString:String)
Local RegEx:TRegEx = TRegEx.Create(Pattern)
Local match:TRegExMatch = RegEx.Find(SearchString)
While match
Local MatchArr:String[]
Local NewString:String = RegExp_Replace(match, ReplaceString, MatchArr)
SearchString = SearchString.Replace(MatchArr[0],NewString)
match = RegEx.Find()
Wend
Return SearchString
End Function

Function RegExp_Replace:String(Match:TRegExMatch, ReplaceString:String, MatchArr:String[] Var)
If match
Local Count:Int = match.SubCount() - 1
Local InString:Int = NumberInString(ReplaceString)

If InString>Count Then
Print "To many SubExp used in ReplaceString"
Return False
EndIf
If InString > 0 Then
If InString<Count Then Count = InString
Local LastFound:Int = -1, Found:Int = 0
MatchArr = MatchArr:String[..Count+1]
MatchArr[0] = match.SubExp(0)
For Local i:Int = 1 To Count
MatchArr[i] = match.SubExp(i)
Found = ReplaceString.Find("$",LastFound + 1)
Local Char:String = ReplaceString[Found+1..Found+2]
Select Char
Case "^" ' First Char Upper
Local Number:Int = Int(ReplaceString[Found+2..ReplaceString.length])
Local SubExp:String = MatchArr[Number]
SubExp = SubExp[0..1].ToUpper()+SubExp[1..SubExp.Length]
ReplaceString = ReplaceString.Replace("$^"+Number,SubExp)
Case "!" ' Upper
Local Number:Int = Int(ReplaceString[Found+2..ReplaceString.length])
Local SubExp:String = MatchArr[Number]
ReplaceString = ReplaceString.Replace("$!"+Number,SubExp.ToUpper())
Case "(" ' Replacement
Local NewFound:Int = ReplaceString.Find(")",Found+1)
Local SearchExp:String = ReplaceString[Found+2..NewFound]
Found = NewFound 'Fix, we can use $ in the replacement pattern
Local Parts:String[] = SearchExp.Split(",")
If Parts.Length = 3 Then
MatchArr[Int(Parts[0])] = MatchArr[Int(Parts[0])].Replace(Parts[1],Parts[2])
ReplaceString = ReplaceString.Replace("$("+SearchExp+")",MatchArr[Int(Parts[0])])
Else
Print "To few Arguments"
EndIf
Default
If isNumeric(Char) Then
Local Number:Int = Int(ReplaceString[Found+1..ReplaceString.length])
ReplaceString = ReplaceString.Replace("$"+Char,MatchArr[Number])
End If
End Select
LastFound = Found
Next
End If
End If
Return ReplaceString
End Function

Function NumberInString:Int(Str:String)
Local RegEx:TRegEx = TRegEx.Create("\$(\^|!|\()?([0-9]{1,2})")
Local match:TRegExMatch = RegEx.Find(Str)
Local Number:Int = 0
While match
Local NewNumber:Int = Int(match.SubExp(match.SubCount() - 1))
If Number<NewNumber Then
Number = NewNumber
EndIf
match = RegEx.Find()
Wend
Return Number
End Function

Function isNumeric:Byte(Str:String)
For Local i:Int = 1 To Str.Length - 1
Local As:Int = Str[i]
If As<47 Or As>58 Then Return False
Next
Return True
End Function
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs
 

Lion

BeitragDi, Apr 06, 2010 1:44
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax hat ein eigenes archiv Wink
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group