RegEx funktioniert nicht

RegExs

Mitglied
Huhu. Weshalb funktioniert der folgende kaskadierte RegEx nicht?

Java:
import com.codename1.util.StringUtil;

String r = StringUtil.replaceAll(f, "[^-a-zA-Z0-9()_]", "_");
r = StringUtil.replaceAll(r, "_{2,}", "_");
r = StringUtil.replaceAll(r, "&", "n");

Es sollen alle Sonderzeichen aus dem Dateinamen f entfernt werden.

Zeile 5 funktioniert, Zeile 3 jedoch nicht. Bin überfragt, denn nach regex101 sollte dieser funktioniert.
 
Ich glaube nicht, dass dieses replaceAll() nach regulären Ausdrücken sucht.
Warum nimmst du nicht das standard String.replaceAll()?

Also:
Java:
String r = f
  .replaceAll("[^-a-zA-Z0-9()_]", "_")
  .replaceAll("_{2,}", "_")
  .replaceAll("&", "n");
 
Geht leider auch nicht 😭

Java:
        try {
            RE re1 = new RE("&");
            RE re2 = new RE("[^-a-zA-Z0-9()_]");
            RE re3 = new RE("_{2,}");
            FileSystemStorage fss = FileSystemStorage.getInstance();
            String[] files = fss.listFiles(homePath);
            ArrayList<String[]> map = new ArrayList<>();
            for (String f : files) {
                if (!fss.isDirectory(f)) {
                    String subst = re1.subst(f, "n");
                    subst = re2.subst(subst, "_");
                    subst = re3.subst(subst, "_");
                    if (!f.equals(subst)) {
                        map.add(new String[]{f, subst});
                    }
                }
            }
            for (String[] sa : map) {
                lm.addItem(Arrays.toString(sa));
            }
            if (force) {

                Dialog.show("Force", "Force clicked.", "OK", null);

            }
        } catch (Exception exc) {
            Dialog.show("IOException", "IOException ioe occurred.", "OK", null);
        }

re1 und re3 werden angewandt, aber re2 ist irgendwie falsch... Liegt das wohl am Perl-Dialekt?
 
Das interessiert mich jetzt aber doch noch etwas. Beim Vorschlag, String.replaceAll zu nutzen gab es den Hinweis:
aber ich nutze https://www.codenameone.com/ , um Anwendung für Desktop, Android und Web zu erstellen

Wo ist dabei das Problem beim nutzen der Java Framework Klassen? String ist eine Basis Klasse und da würde ich eine relativ vollständige Unterstützung erwarten.
Desktop und Android ist kein Problem -> Java SE wird auf dem Desktop genutzt. Android hat da dann Retrolambda um eben Java 8 Lambdas zu bekommen. (String Klasse bietet das aber schon ewig und auch zu Java 7 Zeiten)

Desktop and Android​

The other ports of Codename One use the VM’s available on the host machines/environments to execute the runtime. Retrolambda is used to provide Java 8 language features in a portable way.
The Android port uses the native Android tools including the gradle build environment in the latest versions.
The desktop port creates a standard JavaSE application which is packaged with the JRE and an installer.
Bei Web kommt TeaVM zum Einsatz:

JavaScript Port​

The JavaScript port of Codename One is based on the amazing work of the TeaVM project. The team behind TeaVM effectively built a JVM that translates Java bytecode into JavaScript source code while maintaining threading semantics using a very imaginative approach.
(Beide Zitate von: https://www.codenameone.com/developer-guide.html)

Da ist es dann tatsächlich so, dass hier die größten Probleme zu erwarten sind, weil TeaVM eben nicht auf das Java Framework in irgend einer Version setzt sondern da etwas eigenes macht.
Due to number of reasons TeaVM does not rely on Java class library of host JVM. Instead, TeaVM comes with its own implementation of subset of Java class library.

Aber was ich so gesehen habe, dürfte es da bei String.replaceAll eigentlich keine Probleme geben. Aber da diese Web Komponente nur Enterprise Kunden vorbehalten ist, konnte ich da nichts ausprobieren.

Wäre super, wenn Du da die Probleme, die Du bekommen hast, etwas erläutern könntest. Denn das wäre ja doch relativ wichtig bei so einem Produkt.
 
Wirklich interessant - in der javadoc listet Codename one auch im Package java.lang die Klasse String und diese ohne replaceAll:

Also scheint das zumindest auf den ersten Blick tatsächlich entsprechend eingeschränkt zu sein - auch wenn ich da so auf Anhieb keine zwingende Notwendigkeit für sehe.
 
Ja, und stattdessen bauen die sich eine eigene Klasse https://www.codenameone.com/javadoc/com/codename1/util/regex/RE.html .
Das kann ich mir eigentlich nur dadurch erklären, dass es evtl. entweder:
  • semantische Unterschiede zwischen den Patterns bzw. der Implementierung von Java SE gibt, so dass deren Implementierung nicht kompatibel zu der von java.lang.String ist (für jede Plattform)
  • eine Implementierung in java.lang.String nicht überall performant wäre, weil ja ein Pattern "on-demand" und temporär compiliert bzw. interpretiert werden müsste (zwar cachebar, aber wer weiß). Bei deren RE Klasse hätte man immerhin noch eigene Instanz einer Kompilierung (wie bei Java SE's regex Pattern Klasse). --> was einen zur nächsten Frage führen könnte? Haben sie java.util.regex.Pattern?
 

Da sehe ich kein Java.util.regex so ich es jetzt auf dem Smartphone nicht übersehen habe.

Das ist da so extrem ausgedünnt und das reduziert doch die Nützlichkeit enorm. Wenn man schaut, wie andere da vorgehen - da wird dann das ganze .Net auf die WebAssembly gebracht.

Das sah auf den ersten Blick sehr interessant aus, aber die Limitierungen sind doch enorm - da sind dann 499€/Monat auch kaum zu rechtfertigen (den JavaScript Part bekommt man nicht drunter) …

Da sind dann andere Ansätze deutlich besser und i.d.R. günstiger … wenn es das gewohnte Framework nicht gibt: dann wäre auch gleich flutter denkbar (keine Kosten, alle Plattformen) oder man greift auf .Net MAUI / Blazor zurück (aber das ist nicht so einheitlich. Da wird die Blazor Webapp in der Mobilen App sozusagen verpackt) …. Oder natürlich ganz klassisch html/css mit JS oder TS und dann Apache Cordova ….

Ich hatte mir da auf den ersten Blick mehr versprochen von …. Aber evtl. ist mein Eindruck ja falsch und wir bekommen da vom @RegExs eine andere Sicht.
 
ALso ich bin sehr zufrieden damit, aber nutze auch nicht die Basic oder Pro Version.

Man kann die Anwendung entweder direkt lokal oder remote bauen lassen, wie man möchte.

Das heruntergeladene Projekt vom Codename One initializr lässt sich sofort in IntelliJ öffnen (es gibt auch ein IJ Plugin...)

Falls euch der Einstieg interessiert, hier wäre eine gute Anlaufstelle: https://www.codenameone.com/developer-guide.html

Ja, es gibt bei bestimmten Sachen Einschränkungen, wie eben bei den regulären Ausdrücken... Codename One verwendet hier eigene Klassen und die Perl-Syntax, was ich erst nicht wusste. Aber wenn man Methoden nutzen möchte, die es "nicht gibt", bekommt man schnell eine Fehlermeldung, wenn man das Projekt lokal baut.

Hoffe, das schreckt einige jetzt nicht zu sehr ab...
 
Danke erst einmal für Deine Rückmeldung. Das war bei mir auch ein kleines bischen Enttäuschung. Das Projekt hatte ich noch gar nicht auf dem Schirm und wenn man sowas sieht, dann versucht man das natürlich direkt einzuordnen. Und das ist dann extrem subjektiv.

Und was man ja auch noch sehen muss: Das waren ja nicht alle Systeme, die unterstützt werden. Es gibt auch noch Übersetzungen hin zu iOS und UVP. Und dann hat man sehr viel und bei regulären Ausdrücken wird vermutlich @httpdigest auch Recht haben mit den Abweichungen bei dem Verhalten der regulären Ausdrücke auf den unterschiedlichen Systemen.

Es war auf jeden Fall interessant, da mal einen Blick drauf zu werfen. Ich wünsche Dir da auf jeden Fall viel Erfolg und Spaß bei.
 
Mit ein Grund war auch, dass ich mich etwas vor dem Umfang und Komplexität des Android Studios scheue. Aber das ist nur eine persönliche Sicht/Erfahrung.
 
Evtl. eine kleiner Hinweis - nicht dass ich da falsch verstanden wurde:

Mit ein Grund war auch, dass ich mich etwas vor dem Umfang und Komplexität des Android Studios scheue. Aber das ist nur eine persönliche Sicht/Erfahrung.
Meine Ablehnung war auch mehr in der Richtung, dass ich andere Multi Plattform Lösungen bevorzuge. Deine Wahl ist auf jeden Fall legitim und die wollte ich nicht anzweifeln oder gar in Frage stellen. Das war also kein "Überlege Dir das noch einmal!" oder so. Daher mich in dem Punkt bitte nicht missverstehen!

Der Wunsch mit dem viel Spaß und Erfolg war also auch ernst gemeint und kein abfälliger Kommentar. Und prinzipiell sieht es sogar so interessant aus, dass ich das sogar noch vertiefen würde, wenn es meine Zeit zulassen würde. aber ich habe zum einen diese Idee vom JAdventure, die ich umsetzen will und zum anderen darf ich mich gerade mit .Net Blazor / .Net MAUI beschäftigen.

Daher auch ganz wichtig: Egal was du wählst: Es wird immer jemand kommen und sagen: Das ist Sch..... nimm lieber was anderes. (Und wenn Du da keinen findest: Komm zu mir. Ich kann das immer sagen 🙂 )
 

Neue Themen


Zurück
Oben