Java17 und Regex

Christopher25

Bekanntes Mitglied
Hallo Zusammen,

ich habe ein kleines/großes Problemchen nach dem Umstellen auf Java17.
Und zwar hat Java leider eine Restriktion eingebaut per Reflection auf bestimmte interne Funktionen zu gestatten.

Ich brauche jedoch aus der Pattern-Klasse die "NamedGroups" HashMap welche mir ja den Gruppennamen und die GroupId liefern soll.
Ich kann leider nicht mehr die methode oder variable mit accessible(true) abfragen.

Ich habe mir daraufhin eine Hilfsfunktion geschrieben welche leider ein wenig komplex ist und zudem Matcher erfordert, was vorher nicht notwendig war.
Das ist aber garnicht das Problem, denn das Problem an meiner neuen Methode ist, dass es nur die Groups zurückliefert in einer HashMap, welche auch tatsächlich in dem gesuchten Text vorkommt.
Ich brauche aber für meinen weiteren Prozess (SyntaxHighlighting) die volle Liste mit allen Gruppen, da meine Logik die halt mit Java8/11 funktioniert hatte alle Gruppen erwartet und es verdammt aufwendig wäre diese Logik umzuschreiben bzw. mir eine neue auszudenken.

Die Hilfsmethode sieht im übrigen folgendermaßen aus für diejenigen die es interessiert:
Java:
public static Map<String, Integer> getNamedGroups(Pattern regex, String text) throws SecurityException, IllegalArgumentException {
        Map<String, Integer> mapOfNamedGroups = new HashMap<>();

        Matcher matcherGroups = Pattern.compile("\\(\\?<([a-zA-Z][a-zA-Z0-9]*)>").matcher(regex.pattern());
        while (matcherGroups.find()) {
            Matcher matcherRegex = regex.matcher(text);
            secondWhile: while (matcherRegex.find()) {
                for (int groupId = 1; groupId < matcherRegex.groupCount(); groupId++) {
                    if (matcherRegex.group(groupId) != null && matcherRegex.group(matcherGroups.group(1)) != null) {
                        mapOfNamedGroups.put(matcherGroups.group(1), groupId);
                        break secondWhile;
                    }
                }
            }
        }

        return mapOfNamedGroups;
    }

Falls ihr einen Tipp habt was ich vielleicht noch machen kann wäre es echt cool wenn ihr mich darauf hinweisen könnt ;)

Thx
 

Christopher25

Bekanntes Mitglied
Ok ich bin soweit erstmal auf Java11 runter gegangen und werden mir irgendwann etwas für dieses Problem einfallen lassen.
Jedoch habe ich noch ein anderes Thema was selbst bei Java11 noch zum tragen kommt.

Und zwar wurden ja die "sun" libs etc. entfernt/unbenannt etc. oder unzugänglich gemacht.
So leider auch die Klasse "ContextMenuContent".
Diese brauch ich jedoch um das Default ContextMenu von dem Javafx HtmlEditor zu erweitern mit neuen MenuItems.
Wenn ich ja ein eigenes ContextMenu setze dann wird ja leider der default überschrieben.

Weiß vielleicht jemand eine effektive Möglichkeit dem HtmlEditor's default-ContextMenu beizubehalten aber neue Items hinzuzufügen?
Ich habe schon ausprobiert das ganze per listener "setOnContextMenuRequested" probiert. Leider scheint dies aber zu früh zu sein, als dass das ContextMenu schon existieren würde.
 

Christopher25

Bekanntes Mitglied
warum denn nicht ?

was willst ud überhaupt machen

und nein ich hab keine ahnung was der regex ausdruck machen sollte oder die methode bewirken sollte
Warum denn nicht?
Weil ab java17 reflection verändert wurde wenn es darum geht auf interne functionen von java zuzugreifen.
Soweit ich weiß ist das wegen dem hier https://openjdk.java.net/jeps/403

Was ich will? nun ich brauche die Map die mir die Group-namen + group-ids in eine map packt. Und zwar brauch ich ALLE.
Der weitere Prozess geht dann hin und benutzt diese für SyntaxHighlighting,
damit ich weiß welche Farben ich von wo bis wo setzen muss wenn gruppe-xy gematched wird.
Aber viel wichtiger ist erstmal die zweite Frage, da ich jetzt erstmal entschieden habe auf java11 zu wechseln anstatt direkt von java8 auf java17.
 

hulda-90

Aktives Mitglied
Moin, füg mal bitte folgende Compiler-Option sowohl beim Compilieren als auch beim Ausführung hinzu: --add-exports java.base/jdk.internal.misc=ALL-UNNAMED

...dann sollte deine Reflection mit Java 17 funktionieren.
 

Christopher25

Bekanntes Mitglied
Moin, füg mal bitte folgende Compiler-Option sowohl beim Compilieren als auch beim Ausführung hinzu: --add-exports java.base/jdk.internal.misc=ALL-UNNAMED

...dann sollte deine Reflection mit Java 17 funktionieren.
Leider nach wie vor
java.lang.reflect.InaccessibleObjectException: Unable to make java.util.Map java.util.regex.Pattern.namedGroups() accessible: module java.base does not "opens java.util.regex"
 

mihe7

Top Contributor
Da wirst Du vermutlich nicht herumkommen, Dir einen kleinen Parser zu schreiben. Der sollte aber nicht so dramatisch sein.
 

hulda-90

Aktives Mitglied
Jetzt kenn ich mich mit IJ nicht so gut aus, aber die Parameter müssen sowohl javac wie auch java übergeben werden (also sowohl beim Übersetzen als auch beim Starten). Anstatt --add-exports kannst du auch --add-opens schreiben, die sollten äquivalent sein.

Wenn es nicht funktioniert, musst du mal anhand der Fehlermeldung ausprobieren, welche Kombination du brauchst... Ich weiß, das klingt ein bisschen, wie Stochern im Nebel, aber is leider so^^

Wenn es auch dann nicht funktioniert... Bleibt dir nur das Verwenden einer älteren Version oder das von @mihe7 erwähnte Umschreiben...
 

Christopher25

Bekanntes Mitglied
Jetzt kenn ich mich mit IJ nicht so gut aus, aber die Parameter müssen sowohl javac wie auch java übergeben werden (also sowohl beim Übersetzen als auch beim Starten). Anstatt --add-exports kannst du auch --add-opens schreiben, die sollten äquivalent sein.

Wenn es nicht funktioniert, musst du mal anhand der Fehlermeldung ausprobieren, welche Kombination du brauchst... Ich weiß, das klingt ein bisschen, wie Stochern im Nebel, aber is leider so^^

Wenn es auch dann nicht funktioniert... Bleibt dir nur das Verwenden einer älteren Version oder das von @mihe7 erwähnte Umschreiben...
So. Funktioniert jetzt. Ich habe wie du sagtest bisschen rumprobiert.
Mir sind zwei Sachen aufgefallen....

1. --add-exports und --add-opens ist nicht das gleiche. Ich brauche --add-opens
2. in der Fehlermeldung sagte der mir ja dass er das Modul "java.util.regex" nicht öffnen kann. Es muss also GENAU das sein
und es reicht nicht das allgemein mit nur "java.util" anzugeben ein "java.util.*" oder so funktioniert ebenso wenig.

Das Ergebnis sieht dann wie folgt aus:
--add-opens java.base/java.util.regex=ALL-UNNAMED

Vielen Dank für Eure Hilfe.
Ich habe jedoch noch die Frage zum Post #2
Soll ich dafür einen neuen Thread aufmachen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F RegEx bei Hexstring Allgemeine Java-Themen 8
H Frage regex greater than less than Allgemeine Java-Themen 7
N Regex schlägt nicht an Allgemeine Java-Themen 10
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
T regex case insensitive trimmed Allgemeine Java-Themen 6
S Zeichen | in regex Allgemeine Java-Themen 8
X Regex mit mehreren Bedingungen machen Allgemeine Java-Themen 5
N Hilfe bei RegEx benötigt Allgemeine Java-Themen 3
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N E-Mail Validator (ohne Regex!) Allgemeine Java-Themen 7
OnDemand Regex von bis Allgemeine Java-Themen 6
W Versionsnummer auslesen - Regex ist zickig Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
G Regex Allgemeine Java-Themen 2
L regex ganzer string? Allgemeine Java-Themen 2
MiMa Geldbetrag mit regex ermitteln. Allgemeine Java-Themen 14
W RegEx Stringliteral finden - Jflex Allgemeine Java-Themen 5
D Regex Probleme Allgemeine Java-Themen 2
Kirby.exe Regex charakter ignorieren Allgemeine Java-Themen 12
S Java SAT (Haltbarkeitsproblem) mit Regex Allgemeine Java-Themen 6
S [Regex] Nur diese Zeichen beachten Allgemeine Java-Themen 1
M Bitte Hilfe mit REGEX (Negieren) Allgemeine Java-Themen 4
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
S Regex mit UND-Verknüpfung Allgemeine Java-Themen 1
P RegEx für Zeiten Allgemeine Java-Themen 7
D Regex: Komplettes Wort bekommen Allgemeine Java-Themen 3
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
P RegEx Allgemeine Java-Themen 3
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
Y regex | n-faches Vorkommen oder gar keins Allgemeine Java-Themen 6
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
M Regex für Zahleneingabe in JavaFX Textfield Allgemeine Java-Themen 18
T Best Practice Wortregeln RegEx Allgemeine Java-Themen 11
A ALTER TABLE mit Hilfe von RegEx zerlegen, splitten Allgemeine Java-Themen 5
H Interpreter-Fehler Regex kompiliert nicht Allgemeine Java-Themen 5
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
Iron Monkey Mit Regex nach Beträge suchen Allgemeine Java-Themen 4
T REGEX Erklaerung Allgemeine Java-Themen 14
T Nur innerhalb des regex-Match ersetzen Allgemeine Java-Themen 9
H Pic Download / Regex Problem Allgemeine Java-Themen 7
F Frage zu Regex möglich Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
H RegEx - Ersetze alles bis Leerzeichen Allgemeine Java-Themen 5
S regex verbrät CPU Allgemeine Java-Themen 6
V Regex Bereichs Filter Allgemeine Java-Themen 4
127.0.0.1 RegEx _ und 0-9 Allgemeine Java-Themen 45
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
P Java String Regex Allgemeine Java-Themen 2
AyKay Regex XPath Allgemeine Java-Themen 4
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
D Regex Raute erkennen Allgemeine Java-Themen 2
nrg Zweistelligen Zahlenbereich mit RegEx Allgemeine Java-Themen 8
GilbertGrape Regex-Problem Allgemeine Java-Themen 2
W Denkblockade RegEx Allgemeine Java-Themen 2
S eigene regEx schreiben Allgemeine Java-Themen 4
C Regex expandieren Allgemeine Java-Themen 6
C Regex Überschniedung von Ausdrücken Allgemeine Java-Themen 16
reibi RegEX - Teilstring Allgemeine Java-Themen 6
R Java-RegEx terminiert nicht Allgemeine Java-Themen 3
M Regex: Ich stehe auf dem Schlauch Allgemeine Java-Themen 2
V Kleines Regex-Problem Allgemeine Java-Themen 3
B Regex "Problem" Allgemeine Java-Themen 4
B RegEx: (Um-)formulieren eines Pattern zur Identifizierung komplexer URLs Allgemeine Java-Themen 7
P RegEx mit HTML Parser für Java möglich? Allgemeine Java-Themen 10
J Regex: Fertige URLS aus Javascript Allgemeine Java-Themen 3
N Java regex Allgemeine Java-Themen 5
K Regex JSON Allgemeine Java-Themen 3
J RegEx Ausdruck Allgemeine Java-Themen 2
J Regex: URLS aus CSS Allgemeine Java-Themen 2
G RegEx- Ausdruck Allgemeine Java-Themen 4
G RegEx kein Unterstrich Allgemeine Java-Themen 2
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
W RegEx Zeile parsen Medium Allgemeine Java-Themen 8
X Java String Regex - Sonderzeichen Filtern Allgemeine Java-Themen 5
S Dateiname mit Regex parsen Allgemeine Java-Themen 3
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
R Java Regex Frage Allgemeine Java-Themen 17
Daniel_L RegEx-Frage: Ersetzen in UBB ausschließen Allgemeine Java-Themen 2
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
S regex für einen Link Allgemeine Java-Themen 3
E Regex alles nach ? löschen Allgemeine Java-Themen 4
M RegEx-Frage Allgemeine Java-Themen 2
R Regex Tokenizer Allgemeine Java-Themen 11
E Regex HTML Tag und Inhalt löschen Allgemeine Java-Themen 4
H RegEX und eMail Allgemeine Java-Themen 4
L-ectron-X Regex zum Entfernen von mehrzeiligen Kommentaren Allgemeine Java-Themen 2
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
nrg Kleine Hilfe mit RegEx Allgemeine Java-Themen 2
B Regex-Fehler nach lib-Update Allgemeine Java-Themen 2
K Contrains oder Regex Allgemeine Java-Themen 3
J replaceAll , "[", "]" & regex Allgemeine Java-Themen 12
P RegEx und $-Zeichen als Literal Allgemeine Java-Themen 5
P RegEx - Worte ausschließen Allgemeine Java-Themen 8
S Regex - was isst denn {javaLetter} und {javaDigit}? Allgemeine Java-Themen 2
D Wie werden Regex-Gruppen kompiliert? Allgemeine Java-Themen 2
Stillmatic RegEx Matches ausgeben Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben