Javascript - RegEx, String zwischen A und (B oder C) filtern

Fragen zu allen anderen Programmiersprachen.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Javascript - RegEx, String zwischen A und (B oder C) filtern

Beitrag von c4s »

Code: Alles auswählen

//test = '#id';
//test = '#id?w=123&h=45';
//test = '#id&h=45';
//test = 'abc#id';
test = 'abc#id?w=123&h=45';
Ich möchte per RegEx den String zwischen - "#" UND ("?" ODER "&" ODER Ende) - herausfiltern. Bei den obigen Beispielen soll das Ergebnis also immer "#id" sein (wobei es auch eine beliebig andere Zeichenkette sein kann).

Ohne jegliche Vorkenntnisse ist mein bescheidener Code bisher folgender:

Code: Alles auswählen

test = test.match(/#(.*)/);
Hiermit bekomme ich scheinbar alles von "#" bis zum Ende...

Kann mir bitte jemand weiterhelfen? RegEx ist für den Anfänger ziemlich undurchsichtig. :wink:
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Javascript - RegEx, String zwischen A und (B oder C) fil

Beitrag von RSBasic »

Ich kann dir die folgende Seite empfehlen: http://txt2re.com
Das ist eine gute Hilfe, um etwas aus einem String herauszufiltern und daraus einen RegEx-Code zu erhalten.
Wenn du deine Elemente ausgewählt hast, dann hast du unten eine große Auswahl an Sprachen, in welcher Sprache der RegEx-Code generiert werden soll.
Vielleicht ist diese Seite für dich hilfreich.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Javascript - RegEx, String zwischen A und (B oder C) fil

Beitrag von STARGÅTE »

Wenn du nur den eigentlichen String "id" filtern willst, also ohne # und ohne ? oder &
dann kannst du es so machen:

Code: Alles auswählen

(?<=#)\w+
So ließt er alles nach der # und bis kein Buchstabe/Zahl mehr kommt.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Javascript - RegEx, String zwischen A und (B oder C) fil

Beitrag von Nino »

STARGÅTE hat geschrieben:So ließt er alles nach der # und bis kein Buchstabe/Zahl mehr kommt.
Ja, aber von "Buchstabe/Zahl" war keine Rede. Wenn in dem gesuchten String z.B. + oder - vorkommt, funktioniert diese Methode nicht.
c4s hat geschrieben:Ich möchte per RegEx den String zwischen - "#" UND ("?" ODER "&" ODER Ende) - herausfiltern. Bei den obigen Beispielen soll das Ergebnis also immer "#id" sein (wobei es auch eine beliebig andere Zeichenkette sein kann).
Außerdem soll offenbar das Zeichen "#" mit zurückgeliefert werden.

Es gibt ja verschiedenen Implementationen von Regulären Ausdrücken, wie das speziell bei Javascript aussieht weiß ich leider nicht. Aber nach diesen allgemeinen Informationen in Wikipedia und Test mit dem RegEx Coach scheint der folgende Reguläre Ausdruck die gewünschten Anforderungen zu erfüllen:

Code: Alles auswählen

#.*?(?=\?|&|$)
Man beachte die Zeichenfolge *?. Durch das Fragezeichen wird der Quantor * als "genügsam" deklariert. Nähere Erklärung im verlinkten Wikipedia-Artikel.

Grüße, Nino
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Javascript - RegEx, String zwischen A und (B oder C) fil

Beitrag von c4s »

Danke an alle Antworten!
RSBasic hat geschrieben:Ich kann dir die folgende Seite empfehlen: http://txt2re.com
Das ist eine gute Hilfe, um etwas aus einem String herauszufiltern und daraus einen RegEx-Code zu erhalten. [...]
Sieht sehr hilfreich aus. Ich werde es mir mal für später merken.
STARGÅTE hat geschrieben:Wenn du nur den eigentlichen String "id" filtern willst, also ohne # und ohne ? oder & dann kannst du es so machen [...]
Nino hat recht. Zahlen usw. dürfen nicht gefiltert werden.
Nino hat geschrieben:

Code: Alles auswählen

#.*?(?=\?|&|$)
Das sieht schon mal sehr gut aus. Gleich mal testen...


Edit:
Vielen Dank! :allright: Funktioniert bestens:

Code: Alles auswählen

//test = '#id';
//test = '#id?w=123&h=45';
//test = '#id&h=45';
//test = 'abc#id';
test = 'abc#id&?w=123&h=45'; 

test = test.match(/#.*?(?=\?|&|$)/);

document.write(test);
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Javascript - RegEx, String zwischen A und (B oder C) fil

Beitrag von c4s »

Noch eine kleine weitere Frage:
Wie kann ich den folgenden regulären Ausdruck so anpassen, dass im Ergebnis kein "#" ist?

Code: Alles auswählen

test = "abc#id123&w=45";
test = test.match(/#.*?(?=\?|&|$)/);  // Ergebnis: "#id123"
Mir ist noch etwas komisches aufgefallen (wie gesagt, kenne mich mit RegEx / JavaScript wenig aus) :

Code: Alles auswählen

test = 'abc#id123';

test = test.substring(test.indexOf('#'));  // Version A (Reicht für diesen Test und obiges Beispiel)
//test = test.match(/#.*?(?=\?|&|$)/);  // Version B

alert(test);  // "#id123"
Hierbei gibt alert() in beiden Fällen "#id123" aus. Aber nur das Ergebnis von Version A kann ich im weiteren Verlauf erfolgreich verwenden. Das von Version B hingegen führt dazu, dass sich eine andere Funktion (nicht von mir sondern prettyPhoto falls es jemand kennt) aufhängt.
Woran kann das liegen? Leerzeichen?
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Javascript - RegEx, String zwischen A und (B oder C) fil

Beitrag von Nino »

c4s hat geschrieben:Wie kann ich den folgenden regulären Ausdruck so anpassen, dass im Ergebnis kein "#" ist?

Code: Alles auswählen

test = "abc#id123&w=45";
test = test.match(/#.*?(?=\?|&|$)/);  // Ergebnis: "#id123"
Dazu nimmst Du statt # das, was am Anfang von Stargates obiger Regex steht. Die ganze Regex lautet dann also:

Code: Alles auswählen

(?<=#).*?(?=\?|&|$)
Grüße, Nino
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: Javascript - RegEx, String zwischen A und (B oder C) fil

Beitrag von Macros »

Der Anfang von Stargates RegEx hat mich stutzig gemacht. Ich wusste noch nicht,
das man eine RegEx so anpassen kann, dass Teile davon gar nicht mit den Ergebnissen zurückgegeben werden.

Nun hab ich mir das RegEx cheat sheet besorgt:
http://www.addedbytes.com/download/regu ... et-v2/pdf/
sehr nützlich :)
Bild
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Javascript - RegEx, String zwischen A und (B oder C) fil

Beitrag von c4s »

@Nino
Danke. Wegen folgendem Fehler war ich mir nicht mehr sicher, ob ich das "#" benötige oder nicht.

c4s hat geschrieben:

Code: Alles auswählen

test = 'abc#id123';

test = test.substring(test.indexOf('#'));  // Version A (Reicht für diesen Test und obiges Beispiel)
//test = test.match(/#.*?(?=\?|&|$)/);  // Version B

alert(test);  // "#id123"
Hierbei gibt alert() in beiden Fällen "#id123" aus. Aber nur das Ergebnis von Version A kann ich im weiteren Verlauf erfolgreich verwenden. Das von Version B hingegen führt dazu, dass sich eine andere Funktion (nicht von mir sondern prettyPhoto falls es jemand kennt) aufhängt.
Woran kann das liegen? Leerzeichen?
Antwort: Version A gibt einen String zurück. Version B hingegen ein Array mit den Ergebnissen. D.h. folgendes müsste richtig funktionieren:

Code: Alles auswählen

test = test.match(/#.*?(?=\?|&|$)/)[0];
@Macros
Kann man bestimmt mal brauchen. *lesezeichen* :allright:
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Antworten