Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   TRegex.Replace Windows vs Android (https://www.delphipraxis.net/195768-tregex-replace-windows-vs-android.html)

QuickAndDirty 23. Mär 2018 14:40

TRegex.Replace Windows vs Android
 
Ich habe folgendes Problem
Delphi-Quellcode:
Function RemoveNonHex(aValue:String):String;
var aRegEx:TRegex;
Begin
  aRegEx := TRegEx.Create('[^A-F0-9]');
  Result := aRegEx.Replace(aValue,'');
End;

//Unter Windows ausgeführt
RemoveNonHex('04-29-14-CA')// = '042914CA'

//Unter Android ausgeführt
RemoveNonHex('04-29-14-CA')// = '04'
Das Windows Verhalten ist das was ich mir wünsche.
Warum bekomme ich das unter Android nicht?
Liegt es daran das
'' in Android ein Nullterminierter String ist und er quasi über all '\u0000' einsetzt?

Klaus01 23. Mär 2018 15:36

AW: TRegex.Replace Windows vs Android
 
.. wie schaut denn die Ausgabe aus, wenn Du direkt aValue ausgibts?
oder wenn Du aRegEx.replace durch replaceStr ersetzt?

Grüße
Klaus

QuickAndDirty 23. Mär 2018 16:15

AW: TRegex.Replace Windows vs Android
 
Wenn ich direct aValue ausgebe sieht die Ausgabe aus wie erwartet.
ReplaceStr würde ich nicht benutzen wegen der verschiedenen Stringarten
und
TStringhelper.Replace
Ist keine Hilfe, weil ich ja Zeichen für Zeichen entscheiden muss.
Daher ja die Regex.

Ich habe es jetzt mit nem Positiven Matching gelöst und ich hänge dann alle Matches aneinander zu einem String...



Diese Lösung funktioniert, weil ich Hexzahlenpaare vorraussetzen kann.
Delphi-Quellcode:
Function RemoveNonHex(aValue:String):String;
var matches:TmatchCollection;
    aMatch:TMatch;
Begin
   Result := '';
   matches := TRegEx.Matches(aValue,'[A-F0-9][A-F0-9]');
   for aMatch in matches do
     if aMatch.success then
       Result := Result + aMatch.Value;
End;
Eine allgemeine Lösung wäre wohl dies hier
Delphi-Quellcode:
Function RemoveNonHex(aValue:String):String;
var matches:TmatchCollection;
    aMatch:TMatch;
Begin
   Result := '';
   matches := TRegEx.Matches(aValue,'[A-F0-9]');
   for aMatch in matches do
     if aMatch.success then
       Result := Result + aMatch.Value;
End;
Absolut dämlich das TRegEx.Replace nicht in Android geht

himitsu 23. Mär 2018 16:36

AW: TRegex.Replace Windows vs Android
 
Also wenn, dann ist das ja ein Bug und den solltest du mal im QC melden.
Egal welches OS ... es sollte überall gleich sein.

Bzw. mal in aktuellerem Delphi probieren, ob das nicht schon behoben wurde.

@QuickAndDirty: Wenn ich bei RegEx am Ende eh alles selber machen würde, dann liese ich das RegEx weg und mach auch noch Suche/Verlgeich selber.

mkinzler 23. Mär 2018 16:44

AW: TRegex.Replace Windows vs Android
 
Beim Test auf https://regexr.com/ entspricht das Verhalten unter Windows dem mit dem flag global und das von Android ohne dieses flag.

QuickAndDirty 28. Mär 2018 10:06

AW: TRegex.Replace Windows vs Android
 
Zitat:

Zitat von himitsu (Beitrag 1397130)
Also wenn, dann ist das ja ein Bug und den solltest du mal im QC melden.
Egal welches OS ... es sollte überall gleich sein.

Ich habe keinen direkten zugriff auf GC... müsste mich dazu mit einer vielbeschäftigten person abstimmen...


Zitat:

Zitat von himitsu (Beitrag 1397130)
Bzw. mal in aktuellerem Delphi probieren, ob das nicht schon behoben wurde.

Delphi 10.2 Update 1 ist die version in der das "Problem" auftaucht.


Zitat:

Zitat von himitsu (Beitrag 1397130)
@QuickAndDirty: Wenn ich bei RegEx am Ende eh alles selber machen würde, dann liese ich das RegEx weg und mach auch noch Suche/Verlgeich selber.

Ja ich hatte so eine Lösung bereits. Wollte dann eine Sache mit regex machen und dachte dann mache ich doch gleich das ganze Stringprocessing mit regex.
Und Regexen gibts ja nicht erst seit gestern...in privaten Projekten (also ohne Delphi) funktionieren die ja auch ganz gut.
Und jetzt ist es halt fertig...
Vielleicht funktionieren die in zukunft auf Android.

QuickAndDirty 28. Mär 2018 10:10

AW: TRegex.Replace Windows vs Android
 
Zitat:

Zitat von mkinzler (Beitrag 1397131)
Beim Test auf https://regexr.com/ entspricht das Verhalten unter Windows dem mit dem flag global und das von Android ohne dieses flag.

Gibts in TRegex ein global flag das sich setzen ließe?
Kann ja sein dass die Defaults auf den Betriebssystemen unterscheidlich sind.


Text=04-29-14-CA
RegEx=[^A-F0-9]

Ergebnisse:

Mit globalflag mit javascript engine
042914CA

Ohne globalflag mit javascript engine
0429-14-CA

Ohne globalflag mit Perl engine
042914CA

mit Delphi engine auf windows
042914CA

mit Delphi engine auf Android
04

mkinzler 28. Mär 2018 10:14

AW: TRegex.Replace Windows vs Android
 
Dieses Flag gibt es bei der Delphi-Implementierung wohl nicht. Möglichweise, wenn man den Count hochsetzt.

Mavarik 28. Mär 2018 10:23

AW: TRegex.Replace Windows vs Android
 
Zitat:

Zitat von himitsu (Beitrag 1397130)
Also wenn, dann ist das ja ein Bug und den solltest du mal im QC melden.

Richtig, wenn es ein Bug ist, sollte dieser natürlich behoben werden! Abgesehen davon, dass ich NIE auf die Idee kommen würde für so etwas RegEx zu nehmen...

Mavarik

mkinzler 28. Mär 2018 10:25

AW: TRegex.Replace Windows vs Android
 
Wenn 2 Plattformen verscheidene Ergebnisse liefern würde ich das auf jeden Fall als Fehler ansehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz