Regular Expression führt zu JS Fehler
Katharina
- javascript
Hallo,
ich habe einen regulären Ausdruck zusammengebaut, der direkt zu Beginn meines Programms gesetzt werden soll. Nach dem Laden der Seite bekomme ich einen Javascript Fehler:
Fehler: invalid quantifier +)?s*[(]?(s*[(]?[0-9]s*[)]?s*[.]?s*[-/]*s*){6,})>?s*$/
Anscheinend merkt der Compiler nicht, dass das '+' mit einem Backslash escaped wurde.
Hier ist mein Ausruck:
var reg = new RegExp("/[1]*<?(\s*(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/");
Wo liegt das Problem?
Katharina
\s ↩︎
Hallo,
var reg = new RegExp("/[1]*<?(\s*(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/");
Wo liegt das Problem?
mit zwei Backslashes vor dem + gibt es zumindest keinen JS-Fehler mehr.
Ich bin mir aber im Moment nicht sicher, ob der reguläre Ausdruck dann noch funktioniert wie gewünscht.
Am einfachsten ist es aber, wenn Du das + einfach in eine Zeichenklasse packst, also ([+]), denn inerhalb einer Zeichenklasse ist ein + einfach ein +.
Ciao,
Andreas
\s ↩︎
Hallo Andreas,
Ich habe die Zeichenfolge '+' durch'[+]' ersetzt und habe jetzt keinen JS Fehler mehr.
Allerdings matcht der Ausdruck jetzt nicht richtig.
Beispiel:
var reg = new RegExp("/[1]*<?(\s*[+]?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/");
var nr;
if (!reg.test(nr)) alert('not ok');
else alert('ok');
Für nr='abc' bekomme ich die Meldung 'not ok', was auch richtig ist. Allerdings bekomme ich für nr='0177 65432' auch die Meldung 'not ok' und das sollte allerdings 'ok' liefern.
Ist da evtl. der Ausdruck falsch?
Katharina
\s ↩︎
Hallo,
was für Zeichenketten möchtest Du denn genau herausfiltern?
Und wie sieht der String aus, den Du dem regulären Ausdruck übergibst?
Wenn Du wirklich nur Ausdrücke à la a='blah' und b='123 789' erwischen willst, dann kannst Du das sehr viel einfacher hinbekommen.
Ciao,
Andreas
Der Ausdruck überpüft, ob es sich um eine gültige Handynummer handelt. Er wurde mir so vorgegeben und ich soll ihn verwenden. Nur irgendetwas stimmt damit nicht. Buchstaben und Sonderzeichen sollen schon mal nicht zulässig sein (ausser '+' '-' '.' ' ' '/' ''). Ansonsten muss der String mindestens 6 Zeichen lang sein (ohne Leerzeichen am Anfang und Ende).
D.h.
falsch ist 'abcde', ' 0003434a', ' ', ...
richtig ist '0177 7777777', '+49 177 777777', '06543-87878', ...
Hallo,
D.h.
falsch ist 'abcde', ' 0003434a', ' ', ...
richtig ist '0177 7777777', '+49 177 777777', '06543-87878', ...
ok, das ist nun doch nicht ganz so trivial, da es ja zig Kombinationen gibt. Ich komme im Moment leider nicht dazu, Deinen regulären Ausdruck zu prüfen (Chef quasi hinter meinem Rücken...) und gehe daher einmal davon aus, daß er grundsätzlich funktioniert.
Beherzige daher den Hinweis von Cheatah.
Wenn Du den ganzen Backslash-Krampf umgehen möchtest, dann kannst Du den regulären Ausdruck aber auch direkt definieren, ohne erst über den String-Kontext zu gehen:
var regexp_mobile = /[1]*<?(\s*(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/;
Versuche es doch einmal so.
Ciao,
Andreas
\s ↩︎
Hi,
Fehler: invalid quantifier +)?s*[(]?(s*[(]?[0-9]s*[)]?s*[.]?s*[-/]*s*){6,})>?s*$/
Der Backslash vor diesem Plus wird erstmal bei der String-Erzeugung interpretiert. Dabei wird + zu +, da + kein definiertes Steuerzeichen ist.
Da Du den Backslash aber im regulären Ausdruck haben willst, mußt Du ihn per Backslash escapen. Dann wird bei der String-Erzeugung \ zu \ - der RegExp bekommt also + zu sehen.
Anscheinend merkt der Compiler nicht, dass das '+' mit einem Backslash escaped wurde.
Nein, der RegExp-Compiler kann das nicht mitbekommen, da der Backslash entfernt wurde lange bevor der RegExp-Compiler aufgerufen wird.
cu,
Andreas
Hi,
heißt das, dass jeder Backslash in meinem Ausdruck mit einem Backslash escaped werden muss, damit er im regulären Ausdruck vorkommt? Also nicht nur dieser eine vor dem '+'?
Katharina
Hi,
heißt das, dass jeder Backslash in meinem Ausdruck mit einem Backslash escaped werden muss, damit er im regulären Ausdruck vorkommt? Also nicht nur dieser eine vor dem '+'?
das heißt, dass Du eines der allerwesentlichsten Grundprinzipien der Software-Entwicklung verinnerlichen musst: Wann immer Du einen Wert in einen Kontext bringst, *musst* Du ihn kontextspezifisch kodieren.
Der Wert, den Du hast, ist Deine Regular Expression. Diese lautet:
/[1]*<?(\s*(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/
Du willst sie nun in einen String-Kontext bringen, nämlich Anführungszeichen drum herum setzen[1]. In einem String existieren Sonderzeichen, welche stringspezifisch kodiert werden müssen. Insbesondere ist der Backslash "" ein solches Sonderzeichen; seine Kodierung in diesem Kontext lautet "\".
Es ist im Prinzip ganz einfach. Das einzige, was Du tun musst, ist, es immer und überall zu bedenken. *Immer* und *überall*.
Cheatah
[1] Warum auch immer.
\s ↩︎
hallo Katharina,
heißt das, dass jeder Backslash in meinem Ausdruck mit einem Backslash
escaped werden muss, damit er im regulären Ausdruck vorkommt? Also nicht
nur dieser eine vor dem '+'?
ja, sobald Du darauf angewiesen bist, einen regulaeren ausdruck ueber den
RegExp-konstruktor zu erzeugen, musst Du genau dies beachten. ausserdem
gehoeren in diesem fall die beiden begrenzer des RegExp-literals nicht mit
in die zeichenkette - schon aus diesem grund ist Deinem konstrukt
var reg = new RegExp("/^[\s]*<?(\s*(\+)?\s*[\(]?(\s*[\(]?[0-9]\s*[\)]?\s*[\.]?\s*[\-\/]*\s*){6,})>?\s*$/");
kein erfolg beschieden; besser also so -
reg = new RegExp("^[\\s]*<?(\\s*(\\+)?\\s*[\\(]?(\\s*[\\(]?[0-9]\\s*[\\)]?\\s*[\\.]?\\s*[\\-\\/]*\\s*){6,})>?\\s*$");
- noch einfacher waere, Du notiertest Deinen ausdruck einfach als RegExp-
literal, dann aendert sich fuer die zeichenfolge naemlich rein gar nichts:
~~~javascript var regX = /[1]<?(\s(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]\s){6,})>?\s*$/;
alert(reg.toString() == regX.toString()); // true;
so long - peterS. - pseliger@gmx.net
--
»Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - [Douglas Crockford](http://javascript.crockford.com/)
ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
\s ↩︎
Liebe Katharina,
Hier ist mein Ausruck:
var reg = new RegExp("/[1]*<?(\s*(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/");Wo liegt das Problem?
entgegen z.B. PHP stehen in Javascript reguläre Suchmuster _nicht_ in Anführungszeichen. Nur wenn Du mit RegExp() ein solches erzeugst, dann verwendest Du Anführungszeichen, dafür aber auch keine Slashes um Dein Muster herum.
Desweiteren meine ich mich zu erinnern, dass man einen zweiten Parameter angeben muss, der z.B. case-insensitive oder greedy steuert. In Deinem Falle lässt Du ihn komplett weg. Probiere doch einen Leerstring als zweiten Parameter!
Probiere doch dieses hier:
var reg = new RegExp("^[\s]*<?(\s*(\+)?\s*[\(]?(\s*[\(]?[0-9]\s*[\)]?\s*[\.]?\s*[\-\/]*\s*){6,})>?\s*$", "");
Liebe Grüße aus Ellwangen,
Felix Riesterer.
\s ↩︎
Servus,
Hier ist mein Ausruck:
var reg = new RegExp[...]
Wo liegt das Problem?
Der RegExp-Konstruktor ist für dynamische Ausdrücke gedacht, welche sich in
der normalen JS/RE-Syntax "var suchmuster = /muster/modifikator;" nicht
erzeugen lassen. Also beispielsweise:
var name = "Katharina";
var suchmuster = new RegExp( "\b" + name + "\b", "i" );
Der zweite Parameter ist optional.
/[1]*<?(\s*(+)?\s*[(]?(\s*[(]?[0-9]\s*[)]?\s*[.]?\s*[-/]*\s*){6,})>?\s*$/
[...]
Buchstaben und Sonderzeichen sollen schon mal nicht zulässig sein
(ausser '+' '-' '.' ' ' '/' '')
Hmm, ich lasse die möglichen Leerstellen mal aussen vor ('[\s]*' sollte wohl
auch ein '\s*' werden):
/ #01
^ #02
<? #03 Ein '<' darf also vorhanden sein
( #04
(+)? #05
[(]? #06 für ein Zeichen braucht es normalerweise keine Klasse
( #07
[(]? #08 Möglich ist also in einer Reihe '('
[0-9] #09 und '0'
[)]? #10 und ')'
[.]? #11 und '.'
[-/]* #12 und keine oder viele, viele '-' oder '/'
){6,} #13 und das ganze (08-12) mindestens sechs mal
) #14
>? #15 siehe 03
$ #16
/ #17
Das ist schon ein eigenartiger Ausdruck: speziell Block 08-12 lässt eine
Menge Unsinn zu; so sind '+(123) (456) (789)' oder '<(0)./-12345>' im Sinne
dieses Ausdrucks valide Zeichenfolgen.
Grüsse
\s ↩︎