Regulärer Ausdruck nach Klammern suchen
T-Rex
- javascript
Moin,
würde gern eine String nach "()" den Klammern abprüfen.
string.match("[()]+") funktioniert nicht, und entwerten ( string.match("[()]+") ) geht auch nicht. Hab noch einiges mehr ausprobiert, ich schaff es aber nicht den Ausdruck so auf zu bauen, dass er die Runden Klammern als Zeichen akzeptiert.
Wenn ich ein new RegExp(/[()]+/) mache und das ganze mit .test(string) abprüfe funktioniert es.
Ich steh auf der Leitung wieso das mit Match nicht funktioniert...?!
kleiner Tipp für mich?
Danke
T-Rex
laut http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:String:match
muss der Inhalt von string.match() eine reguläre Expression sein oder ein Objekt sein, dessen Inalt eine RE ist..
Was ist "hallo", was ist 'hallo' ?
mfg Beat
Hallo,
laut http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:String:match
muss der Inhalt von string.match() eine reguläre Expression sein oder ein Objekt sein, dessen Inalt eine RE ist..
Dort steht, man kann alles übergeben, RegExp-Objekt ist natürlich an besten, aber wenn es keine RegExp ist, dann wird versucht, den Parameter in ein solches Objekt umzuwandeln.
Mathias
Ist 'hallo' ein "non-RegExp object obj"?
mfg Beat
Hi,
Ist 'hallo' ein "non-RegExp object obj"?
zunächst: 'hallo' ist ein Objekt. Entweder ist es ein RegExp-Objekt, oder es ist es nicht. Was davon trifft Deiner Meinung nach zu? :-)
Cheatah
Ist 'hallo' ein "non-RegExp object obj"?
zunächst: 'hallo' ist ein Objekt. Entweder ist es ein RegExp-Objekt, oder es ist es nicht. Was davon trifft Deiner Meinung nach zu? :-)
Meine Meinung ist irrelevant. Ich interpretiere kein Java-Script.
if( "bla(bla".match( /(/ ) ){ alert('OK' );}
Ausgabe: OK
if( "bla(bla".match( '(' ) ){ alert('OK' );}
Ausgebe: FEHLER
Daraus schliesse ich, dass ' ' von firefox nicht als obj behandelt werden kann, und nur günstige Umstände wie im Falle von 'hallo' hier funktionieren.
Das Entscheidende sind die Delimiter / / versus ' ' oder " ".
mfg Beat
Hi,
Ist 'hallo' ein "non-RegExp object obj"?
zunächst: 'hallo' ist ein Objekt. Entweder ist es ein RegExp-Objekt, oder es ist es nicht. Was davon trifft Deiner Meinung nach zu? :-)
Meine Meinung ist irrelevant. Ich interpretiere kein Java-Script.
das ist richtig. Dennoch unterstelle ich, dass Deine Antwort hier mit der eines JavaScript-Interpreters übereinstimmen würde.
if( "bla(bla".match( /(/ ) ){ alert('OK' );}
Ausgabe: OK
if( "bla(bla".match( '(' ) ){ alert('OK' );}
Ausgebe: FEHLER
Daraus schliesse ich, dass ' ' von firefox nicht als obj behandelt werden kann,
Ich hingegen schließe, dass innerhalb von Singlequotes ein anderes Escaping stattfindet als innerhalb von Slashes. Test:
alert('(');
und nur günstige Umstände wie im Falle von 'hallo' hier funktionieren.
Günstige Umstände entstehen durch die Anwendung von Grundprinzipien: Wenn Du einen Wert in einen Kontext bringst, musst Du ihn kontextspezifisch kodieren. Ist der Wert beispielsweise eine Regular Expression, die innerhalb eventueller Delimiter "(" lauten soll, und wird dieser Wert in den JavaScript-String-Kontext durch Singlequotes gebracht, sind alle darin enthaltenen Singlequotes und Backslashes durch einen Backslash zu kodieren. Und siehe: Kaum macht man's richtig, schon funktioniert's ;-)
Cheatah
Hallo,
if( "bla(bla".match( /(/ ) ){ alert('OK' );}
Ausgabe: OKif( "bla(bla".match( '(' ) ){ alert('OK' );}
Ausgebe: FEHLER
match(str) läuft auf new RegExp hinaus.
Ja,
new RegExp("(")
ergibt einen Fehler bei der Kompilierung des regulären Ausdrucks (SyntaxError: unterminated parenthetical), man muss
new RegExp("\(")
schreiben.
Das liegt daran, dass der String-Literal
"("
den String
"("
ergibt, also ein String der Länge 1!). Denn ( ist keine gültige Escape-Sequenz, daher wird das \ einfach ignoriert. Hingegen
"\("
ergibt den String
"("
(also ein String der Länge zwei), und der wird schließlich an new RegExp übergeben.
Innerhalb von Zeichenklassen kann man sich die Maskierung wie gesagt sparen:
new RegExp("[(]")
Mathias
Ich danke dir für die Erklärung.
Offenbar weicht hier Javascript von Perl ab und
zwischen einer Konversion von " " in / / für string.match() liegt ein besonderer Schritt.
Daraus darf ich schliessen dass string.match( "example" ) relativ schlechte Praxis ist
gegenüber string.match( /example/ ).
mfg Beat
Hallo,
Daraus schliesse ich, dass ' ' von firefox nicht als obj behandelt werden kann
Was meinst du damit?
Ein String wird natürlich nicht direkt als RegExp-Objekt behandelt, sondern mit new RegExp umgewandelt. Wurde schon zweimal in diesem Thread verlinkt.
Das von dir geschilderte Phänomen hat aber eher etwas mit der Verarbeitung von String-Literalen zu tun. Wenn hinten "(" herauskommen soll, muss man den String-Literal "\(" notieren; das ist alles.
Mathias
Hi,
du musst den reg. Ausdruck übergeben, keinen String:
string.match(/[()]+/);
und bei einer Klammer (glaube die zweite), dürfte das Escapen nicht notwendig sein... bin mir aber nicht so sicher.... vielleicht war das auch bei []
Gruß!
Hallo,
du musst den reg. Ausdruck übergeben, keinen String:
Das ist nicht ganz richtig.
string.match(/[()]+/);
Ist identisch mit
string.match("[()]+")
und bei einer Klammer (glaube die zweite), dürfte das Escapen nicht notwendig sein... bin mir aber nicht so sicher.... vielleicht war das auch bei []
Ist bei keiner nötig.
string.match("[()]+") bzw. string.match(/[()]+/) funktioniert vorzüglich und macht genau das, was es soll.
Die Frage ist, ob T-Rex das will. Sie gibt bei der Anwendung einen Array mit dem ersten Treffer zurück, sofern es einen gibt.
Gibt es keinen Treffer, wird null zurückgegeben.
Mathias
Hallo,
würde gern eine String nach "()" den Klammern abprüfen.
Einfach prüfen, ob diese beiden Zeichen irgendwo im String vorkommen?
string.match("[()]+") funktioniert nicht, und entwerten ( string.match("[()]+") ) geht auch nicht. Hab noch einiges mehr ausprobiert, ich schaff es aber nicht den Ausdruck so auf zu bauen, dass er die Runden Klammern als Zeichen akzeptiert.
Ich weiß ja nicht, von welchem Browser du sprichst, aber in Firefox ergibt "bla(bla".match("[()]+") einen Array mit einem Element, nämlich dem String "(", das ist der erste Treffer.
Wenn du einen Array mit allen Treffern haben willst, musst du den RegExp-Literal /[()]+/g übergeben (mit http://de.selfhtml.org/javascript/objekte/regexp.htm#allgemeines@title=global-Flag).
Wenn ich ein new RegExp(/[()]+/) mache
/[()]+/ erzeugt bereits ein RegExp-Objekt, es ist unnötig, da nochmal new RegExp herum zu schreiben.
und das ganze mit .test(string) abprüfe funktioniert es.
Äh - was erwartest du denn als Rückgabewert? test() macht einfach was anderes als match().
test() gibt true oder false zurück, match() gibt einen Array mit Treffern oder null zurück.
Ich steh auf der Leitung wieso das mit Match nicht funktioniert...?!
WAS »funktioniert nicht«?
Mathias
Moin,
würde gern eine String nach "()" den Klammern abprüfen.
string.match("[()]+") funktioniert nicht, und entwerten ( string.match("[()]+") ) geht auch nicht. Hab noch einiges mehr ausprobiert, ich schaff es aber nicht den Ausdruck so auf zu bauen, dass er die Runden Klammern als Zeichen akzeptiert.Wenn ich ein new RegExp(/[()]+/) mache und das ganze mit .test(string) abprüfe funktioniert es.
Ich steh auf der Leitung wieso das mit Match nicht funktioniert...?!
kleiner Tipp für mich?Danke
T-Rex
Als Rückgabe Wert erwarte ich einfach ein "true" oder "false". Test braucht unbedingt ein RexExp wie ich bemerkt hab, während match auch mit einem String zurecht kommt, außer in dem String sind (Klammern), dann funktioniert es wiederum nicht. Etwas konfus, aber durch die Diskussion hier hab ich schon eine Ahnung wieso das so ist.
Danke :)
Hallo,
Als Rückgabe Wert erwarte ich einfach ein "true" oder "false".
Dann bist du mit match auf dem Holzweg.
Test braucht unbedingt ein RexExp wie ich bemerkt hab,
Ja ach - test ist eine Methode eines RegExp-Objektes und erwartet einen String als Parameter ...
während match auch mit einem String zurecht kommt,
... match ist eine Methode von String-Objekten und erwartet ein RegExp-Objekt als Parameter (oder einen String oder sonst etwas, was in ein RegExp-Objekt umgewandelt werden kann).
außer in dem String sind (Klammern), dann funktioniert es wiederum nicht.
Natürlich »funktioniert es«, wenn du die Klammern richtig maskierst, damit sie bei der Umwandlung von String in RegExp noch vorhanden sind.
Mathias
außer in dem String sind (Klammern), dann funktioniert es wiederum nicht.
Natürlich »funktioniert es«, wenn du die Klammern richtig maskierst, damit sie bei der Umwandlung von String in RegExp noch vorhanden sind.
Und wie maskiert man sie richtig?
T-Rex
Hallo,
Und wie maskiert man sie richtig?
Indem du meine Postings in diesem Thread liest.
https://forum.selfhtml.org/?t=172530&m=1130846
Mathias