Seite 1 von 1

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

Verfasst: 04.07.2012 07:51
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:

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

Verfasst: 04.07.2012 07:56
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.

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

Verfasst: 04.07.2012 09:01
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.

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

Verfasst: 04.07.2012 10:27
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

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

Verfasst: 04.07.2012 18:06
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);

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

Verfasst: 04.07.2012 20:45
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?

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

Verfasst: 04.07.2012 21:46
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

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

Verfasst: 05.07.2012 06:51
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 :)

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

Verfasst: 06.07.2012 07:22
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: