RegEx in JavaScript
Hannes Weninger
- javascript
Hallo,
ich möchte folgendes Format checken: 123:23
also vor dem Doppelpunkt max 3 Stellen, danach 2 Stellen. Vor und nach dem Komma können nur Zahlen stehen. Es kann aber auch sein, dass z.B. :23 weggelassen wurde. Das ist auch gültig. Gibt es dafür eine RegEx, welche ich in JavaScript verwenden könnte? Danke! Hannes
Aloha ;)
ich möchte folgendes Format checken: 123:23
also vor dem Doppelpunkt max 3 Stellen [Zahlen],
Das wäre dann \d{1,3}
- mindestens eine, maximal 3 Zahlen, daraufhin ein Doppelpunkt, also \d{1,3}:
.
danach 2 Stellen [Zahlen].
Wie jetzt - exakt oder maximal? Falls exakt, dann \d{2}
, sonst \d{1,2}
; ich geh mal von letzterem aus. Mit dem, was wir schon hatten, ist das dann \d{1,3}:\d{1,2}
.
Vor und nach dem Komma können nur Zahlen stehen. Es kann aber auch sein, dass z.B. :23 weggelassen wurde. Das ist auch gültig.
Also verpacken wir den Teil mit dem Doppelpunkt noch in eine "genau einmal oder überhaupt nicht"-Subclause:
\d{1,3}(:\d{1,2})?
Gibt es dafür eine RegEx, welche ich in JavaScript verwenden könnte?
Ja - die oben genannte. Du kannst sie auch online testen und an deine Bedürfnisse anpassen.
Sei dir im Klaren darüber, dass das (wenn du mehr als einen match zulässt) auch ein 1234:12 matcht - mit zwei Vorkommnissen (123 und 4:12). Wölltest du so etwas nicht hättest du dich genauer ausdrücken müssen. Ins Blaue geraten könnte es sein, dass du deinen Regex noch mit entsprechenden Wortgrenzen (\b\d{1,3}(:\d{1,2})?\b
, aber Achtung, auch :
ist eine Wortgrenze) umschließen willst oder - wahrscheinlich eher - die Anfang-Ende-Markierung (^\d{1,3}(:\d{1,2})?$
, Test mit multiline-flag) einsetzen möchtest.
Grüße,
RIDER
Vielen Dank für Deine Antwort. Ich hab jetzt mal ein JsFiddle draus gemacht:
Leider funktioniert es noch nicht wie gewünscht. Könntest du vielleicht kurz drüberschaun was ich falsch gemacht habe.
Danke! Hannes
Vielen Dank für Deine Antwort. Ich hab jetzt mal ein JsFiddle draus gemacht:
Leider funktioniert es noch nicht wie gewünscht. Könntest du vielleicht kurz drüberschaun was ich falsch gemacht habe.
Backslashes in JavaScript-Strings sind das Maskierungszeichen, haben also eine eigene Semantik. Wenn diese Semantik nicht zum Tragen kommen soll, musst du den Backslash seinerseits maskieren. Also statt
new RegExp('^\d{1,3}(:\d{1,2})?$')
-> new RegExp('^\\d{1,3}(:\\d{1,2})?$')
.
Noch besser für die Lesbarkeit ist es aber die Literal-Schreibweise für reguläre Ausdrücke zu verwenden, also: /^\d{1,3}(:\d{1,2})?$/
new RegExp()
benötigt man nur dann, wenn man einen regulären Ausdruck generisch zusammen bauen möchte. Das braucht man also etwa so oft wie eine Division durch Null.
Grundlage für Zitat #2070.
Lieber 1unitedpower,
new RegExp()
benötigt man nur dann, wenn man einen regulären Ausdruck generisch zusammen bauen möchte.
richtig. Und das kommt tatsächlich vor.
Das braucht man also etwa so oft wie eine Division durch Null.
Nein, öfter.
Liebe Grüße,
Felix Riesterer.
new RegExp()
benötigt man nur dann, wenn man einen regulären Ausdruck generisch zusammen bauen möchte.richtig. Und das kommt tatsächlich vor.
Mit regulären Ausdrücken ist es wunderbar einfach möglich für reguläre Sprachen festzustellen, ob ein Wort dieser Sprache angehört. Falls man Mal einem Fall begegnet, der so komplex ist, dass er nicht mehr mit regulären Ausdrücken gelöst werden kann, dann ist die zugrundeliegende Sprache auch nicht regulär. Häufig handelt es sich dann um eine kontextfreie Sprache - der Worttest für diese Klasse kann dann auf ähnlich natürliche Weise mit kontextfreien Grammatiken formuliert werden. In JavaScript gibt es dafür zwar keine eingebettete Syntax, aber die Theorie ist so weit fortgeschritten, dass die notwendigen Parser vollständig automatisch erzeugt werden können. Es gibt ähnliche Lösungswege für Sprachen noch höherer Ausdrucksstärke. Häufig muss man auch nur ein paar wenige Spezialfälle einer ansich ausdrucksstarken Sprache testen, dann kann es pragmatisch sein, sich einfach schnell einen eigenen Test zu programmieren. Mir ist allerdings in der Praxis noch nie ein Fall untergekommen, bei dem zusammengeschusterte reguläre Ausdrücke die bevorzugte Lösung ergeben haben.
@@1unitedpower
new RegExp()
benötigt man nur dann, wenn man einen regulären Ausdruck generisch zusammen bauen möchte.Mit regulären Ausdrücken ist es wunderbar einfach möglich für reguläre Sprachen festzustellen, ob ein Wort dieser Sprache angehört.
An der Stelle noch der Hinweis, dass RegExp
etwas anderes meint als einen regulären Ausdruck.
LLAP 🖖
@@Gunnar Bittersmann
Oops, da ist bei der Konvertierung in Markdown was verloren gegangen. Es muss heißen:
(10) [aφ] = a | [φ]
Könnte sich mal ein Admin der Sache annehmen? Danke.
LLAP 🖖
Hallo Gunnar Bittersmann,
Könnte sich mal ein Admin der Sache annehmen? Danke.
Auf einfachem Wege wird das nichts. Ich habe auch keine Idee, was Kramdown veranlasst so zu denken, wie es denkt. Ich kann aber bestätigen, dass es im Quelltext genau so aussieht wie es aussehen muss.
Möglicherweise ist es am besten, das komplette Posting per Hand zu übersetzen. Das wird aber frühestens heute Nachmittag. Es sei denn jemand anderes nimmt sich dessen an.
Bis demnächst
Matthias
Hallo Matthias,
Möglicherweise ist es am besten, das komplette Posting per Hand zu übersetzen.
Ich wiederhole mich nochmal und versuche es sehr deutlich zu machen:
Das kann ungeahnte Nebenwirkungen haben. Ich muss mir anschauen, wo der Fehler liegt.
LG,
CK
Hallo Christian Kruse,
Ich wiederhole mich nochmal und versuche es sehr deutlich zu machen:
Das kann ungeahnte Nebenwirkungen haben. Ich muss mir anschauen, wo der Fehler liegt.
So einen netten Rüffel habe ich ja schon lange nicht mehr bekommen ;-)
Bis demnächst
Matthias
Hallo Matthias,
So einen netten Rüffel habe ich ja schon lange nicht mehr bekommen ;-)
Sorry, einen Rüffel wollte ich nicht aussprechen. Es ist nur so, dass die Beiträge aus V4 übersetzt werden nach Markdown und dann nach HTML. Das führt dazu, dass es ziemlich haarig werden kann, wenn man 4er-Beiträge einfach nach Markdown übersetzt. Die Markierung „dieser Beitrag ist CFML 4“ bleibt ja bestehen. Ich schicke dann also Markdown in einen CFML-nach-Markdown-Konvertierer.
LG,
CK
Hallo Christian Kruse,
Sorry, einen Rüffel wollte ich nicht aussprechen.
kein Problem. Ich hatte schon im Hinterkopf, dass du davor gewarnt hast. Aber ich dachte mir, wenn das Ergebnis richtig aussieht, …
Es ist nur so, dass die Beiträge aus V4 übersetzt werden nach Markdown und dann nach HTML. Das führt dazu, dass es ziemlich haarig werden kann, wenn man 4er-Beiträge einfach nach Markdown übersetzt. Die Markierung „dieser Beitrag ist CFML 4“ bleibt ja bestehen. Ich schicke dann also Markdown in einen CFML-nach-Markdown-Konvertierer.
Bei manchen Beiträgen versagt das aber, so zum Beispiel bei Gunnars Beiträgen zu php in html schachteln oder umgekehrt <Hände auf dem Rücken verschränkt /><unschuldig guck /><Liedchen träller /> ;-) (einer meiner Lieblingsfilme: https://de.wikipedia.org/wiki/Dennis_(Film))
Lässt es sich einrichten, diese Markierung ggf. zu entfernen oder schaust du einfach nur nach dem Datum?
Bis demnächst
Matthias
Hallo Matthias,
Bei manchen Beiträgen versagt das aber, so zum Beispiel bei Gunnars Beiträgen zu php in html schachteln oder umgekehrt <Hände auf dem Rücken verschränkt /><unschuldig guck /><Liedchen träller /> ;-) (einer meiner Lieblingsfilme: https://de.wikipedia.org/wiki/Dennis_(Film))
Dann sollte man mich darüber informieren, dass ich mir das anschauen kann... ich glaub, das hatte ich auch schonmal gesagt ;-)
Lässt es sich einrichten, diese Markierung ggf. zu entfernen oder schaust du einfach nur nach dem Datum?
Jeder Beitrag hat einen Flag format
, der entweder cfml
oder markdown
sein kann.
LG,
CK
Hallo Christian Kruse,
Jeder Beitrag hat einen Flag
format
, der entwedercfml
odermarkdown
sein kann.
Könntest du diesen bitte für
auf markdown
setzen?
Alternativ kannst du natürlich auch die Versionen löschen und an deinem cfmltomarkdown-parser umhertesten, aber ich befürchte -da die allermeisten alten Beiträge ja ziemlich lesbar sind- viel viel Aufwand für relativ wenige Beiträge.
Noch eine andere Alternative wäre, Beiträgen, die in C-Forum-Markup-Language (ich hoffe, ich hab das richtig übersetzt) geschrieben sind, beim Edit einen Radiobutton mitzugeben, der es admins ermöglicht, dieses Flag zu ändern. Am besten mit dem Hinweis: "Nur ändern, wenn der Beitrag vollständig in Markdown umgewandelt wurde"
Weil du von ungeahnten Nebenwirkungen schriebst: Die sind doch aber auf den Beitrag beschränkt?
Bis demnächst
Matthias
Hallo Matthias,
Alternativ kannst du natürlich auch die Versionen löschen und an deinem cfmltomarkdown-parser umhertesten, aber ich befürchte -da die allermeisten alten Beiträge ja ziemlich lesbar sind- viel viel Aufwand für relativ wenige Beiträge.
Da bin ich mir nicht sicher; das sind immerhin fast 17 Jahre Archiv.
Noch eine andere Alternative wäre, Beiträgen, die in C-Forum-Markup-Language (ich hoffe, ich hab das richtig übersetzt) geschrieben sind, beim Edit einen Radiobutton mitzugeben, der es admins ermöglicht, dieses Flag zu ändern. Am besten mit dem Hinweis: "Nur ändern, wenn der Beitrag vollständig in Markdown umgewandelt wurde"
Das ist problematisch, denn da hängen ja z.B. auch die Versionen dran. Dann dürften solche Beiträge nur ohne Versionen editiert werden.
Weil du von ungeahnten Nebenwirkungen schriebst: Die sind doch aber auf den Beitrag beschränkt?
Auf den Beitrag und dessen Auffindbarkeit. Denn der Such-Index wird ja aus dem CFML->Markdown->Plaintext-Ergebnis generiert.
LG,
CK
Hallo Matthias,
so, ich habe nun folgendes implementiert:
LG,
CK
Hallo Christian Kruse,
so, ich habe nun folgendes implementiert:
- editieren von Beiträgen im CFML-Format führt dazu, dass danach die Beiträge als Markdown angesehen werden
Hm. Vermutlich wird es viel häufiger Fälle geben, in denen einfach nur Text geändert werden muss, etwa wenn jemand seinen Beitrag anonymisieren möchte.
Ein Radiobutton wäre vielleicht doch die bessere Wahl, allerdings (vermutlich?) auch mit deutlich mehr Programmieraufwand verbunden.
- das Feature Versionen anzulegen wird für diese Edit-Operation deaktiviert
Damit hätte ich kein Problem. Mmn. bräuchte ohnehin nur die letzte Version archiviert zu werden.
Bis demnächst
Matthias
Hallo Matthias,
- editieren von Beiträgen im CFML-Format führt dazu, dass danach die Beiträge als Markdown angesehen werden
Hm. Vermutlich wird es viel häufiger Fälle geben, in denen einfach nur Text geändert werden muss, etwa wenn jemand seinen Beitrag anonymisieren möchte.
Ein Radiobutton wäre vielleicht doch die bessere Wahl, allerdings (vermutlich?) auch mit deutlich mehr Programmieraufwand verbunden.
Das geht nicht, wie bereits dargelegt. Ausserdem enthält CFML auch non-printables, etwa u007F
- das gibt dann nochmal eigene Probleme. Es hat schon seinen Grund, dass ich da so nachdrücklich war ;-)
Nein, wenn archivierte Nachrichten editiert werden müssen, dann müssen sie auch nach Markdown konvertiert werden. Das geht sinnvoll nicht anders.
LG,
CK
Lieber 1unitedpower,
es mag manchmal sinnvoller sein, eine Schleife zu notieren, in der ein Muster jeweils neu (immer mit einem anderen Bestandteil) erstellt wird, anstatt dass man alle Bestandteile mit Pipes verkettet in ein hochkomplexes Suchmuster schmeißt, um dieses einmal zu matchen oder replacen.
Liebe Grüße,
Felix Riesterer.
es mag manchmal sinnvoller sein, eine Schleife zu notieren, in der ein Muster jeweils neu (immer mit einem anderen Bestandteil) erstellt wird, anstatt dass man alle Bestandteile mit Pipes verkettet in ein hochkomplexes Suchmuster schmeißt, um dieses einmal zu matchen oder replacen.
Das leuchtet selbst mir ein, gutes Beispiel!
@@Camping_RIDER
Das wäre dann
\d{1,3}
- mindestens eine, maximal 3 Zahlen
Nein, eine Zahl. Mit mindestens einer, maximal 3 Ziffern (Stellen).
Gut, dass du nichts mit Mathe zu tun hast. 😈
Wie jetzt - exakt oder maximal? Falls exakt, dann
\d{2}
, sonst\d{1,2}
; ich geh mal von letzterem aus.
Ich hätte ersteres vermutet. Sieht aus wie eine Angabe Minuten(:Sekunden) oder Stunden(:Minuten), wo man die Angabe nach dem Doppelpunkt zweistellig (d.h. ggfs. mit führender Null) haben möchte.
Genaueres weiß der Theo.
LLAP 🖖
PS: Ich wundere mich mal wieder darüber, dass \d
die arabischen Ziffern ٠١٢٣٤٥٦٧٨ nicht matcht.
Lieber Gunnar,
PS: Ich wundere mich mal wieder darüber, dass
\d
die arabischen Ziffern ٠١٢٣٤٥٦٧٨ nicht matcht.
matcht es denn chinesische?
Liebe Grüße,
Felix Riesterer.
Hallo,
matcht es denn chinesische?
oder gar lateinische?
Gruß
Kalk
Tach!
PS: Ich wundere mich mal wieder darüber, dass
\d
die arabischen Ziffern ٠١٢٣٤٥٦٧٨ nicht matcht.
Was gibt es da zu wundern? \d ist definiert als [0..9].
Mit Perl-Regex kommst du vielleicht mit \p{N} ans Ziel. Aber das MDN führt \p nicht in seiner Liste auf.
dedlfix.
Hallo,
Was gibt es da zu wundern? \d ist definiert als [0..9].
Gunnar möchte sich darüber wundern, dass unsere Ziffern (0 bis 9) zwar als arabische Ziffern bezeichnet werden, aber wenn man auf die Idee kommt, aus dem Zeichensatz für Arabische Schrift sich die Ziffern rauszusuchen, man plötzlich vom Computer ein X für ein U vorgemalt kriegt.
Gruß
Kalk
@@dedlfix
PS: Ich wundere mich mal wieder darüber, dass
\d
die arabischen Ziffern ٠١٢٣٤٥٦٧٨ nicht matcht.Was gibt es da zu wundern? \d ist definiert als [0..9].
Man hätte es auch anders definieren können: so, dass \d
alles matcht, was im Unicode-Standard als Ziffernzeichen („Nd - Number, decimal“) definiert ist.
LLAP 🖖
Aloha ;)
PS: Ich wundere mich mal wieder darüber, dass
\d
die arabischen Ziffern ٠١٢٣٤٥٦٧٨ nicht matcht.Was gibt es da zu wundern? \d ist definiert als [0..9].
Man hätte es auch anders definieren können: so, dass
\d
alles matcht, was im Unicode-Standard als Ziffernzeichen („Nd - Number, decimal“) definiert ist.
Hätte man, ja. Und dadurch anderes aufs Spiel gesetzt, zum Beispiel die Einfachheit der vorliegenden Definition, die auch Vorteile bietet. Außerdem ist JavaScript als Programmiersprache nicht an Unicode gebunden; die Verknüpfung mit dem Unicode-Standard ist also eher schwer möglich.
Nach wie vor ist außerdem RegEx vor allem ein Programmierwerkzeug - und Programmierung erfolgt nun mal (das kann man gutfinden oder auch nicht - ich finds gut) vordergründig auf Grundlage der englischen Sprache und dem dieser zugrundeliegenden Basiszeichensatz ASCII. Es macht also durchaus Sinn, dass in den vordefinierten Abkürzungen (nichts anderes ist \d
- eine Abkürzung für ein Subset von ASCII-Zeichen) auch nur ASCII bedient wird, selbst wenn im Grunde genommen Zeichen jedes Zeichensatzes später für RegExe eingesetzt werden kann.
Jede andere Lösung wäre - gerade vor dem Hintergrund unterschiedlicher Zeichenkodierungen - sehr komplex umzusetzen und wird wohl auch nicht sehr oft gebraucht. Der Aufwand würde also ziemlich sicher nicht dem Nutzen gerecht werden.
Grüße,
RIDER
@@Camping_RIDER
Nach wie vor ist außerdem RegEx vor allem ein Programmierwerkzeug - und Programmierung erfolgt nun mal (das kann man gutfinden oder auch nicht - ich finds gut) vordergründig auf Grundlage der englischen Sprache und dem dieser zugrundeliegenden Basiszeichensatz ASCII.
Reguläre Ausdrücke (besser gesagt: Suchmuster) sind ein Werkzeug der Stringverarbeitung, um Muster in Zeichenketten zu finden. Und Inhalte von Zeichenketten können aus beliebigen Sprachen kommen.
Außerdem ist der ASCII-Zeichensatz zur Notation der englischen Sprache auch nicht ausreichend.
Jede andere Lösung wäre - gerade vor dem Hintergrund unterschiedlicher Zeichenkodierungen - sehr komplex umzusetzen und wird wohl auch nicht sehr oft gebraucht.
Die Zeichencodierung sollte da nicht reinspielen – die spielt eine Rolle, wenn ein Dokument gespeichert, übertragen und eingelesen wird. Wenn das Script läuft, ist das längst gegessen.
So sollte es sein. Bei Astral-Zeichen sieht das anders aus. JavaScript has a Unicode problem.
LLAP 🖖
Aloha ;)
Das wäre dann
\d{1,3}
- mindestens eine, maximal 3 ZahlenNein, eine Zahl. Mit mindestens einer, maximal 3 Ziffern (Stellen).
Gut, dass du nichts mit Mathe zu tun hast. 😈
Stimmt - zwischen 0 und 7 Uhr ruht geistig generell vieles bei mir :P
Grüße,
RIDER
Hallo Gunnar,
PS: Ich wundere mich mal wieder darüber, dass
\d
die arabischen Ziffern ٠١٢٣٤٥٦٧٨ nicht matcht.
In PCRE mit u (PCRE_UTF8) flag schon. \w ebenfalls. Aber hier geht's ja um JS regex.
lG, Robert