Regex zur Suche nach Vorkommen einer Zahl in String
domeb
- javascript
Hi,
ich will per regex herausfinden, ob sich in einem String eine Zahl befindert, welche mindestens 3 Ziffern aneinander enthält:
"123" => false
"test 123 test" => false
"test 12 test" => true
"test 12 3 test" => true
ich versuche es zur Zeit folgendermasen, was allerdings nicht gerade funktioniert.
string = "123 test";
/[^0-9]{3,}/g.test(string);
Danke für die Hilfe!
Hallo,
/[^0-9]{3,}/g.test(string);
damit suchst du mindestens drei aufeinanderfolgende Zeichen, die *keine* Ziffern sind, also genau das Gegenteil von dem, was du möchtest. Warum negierst du die Zeichenklasse?
Ciao,
Martin
@@domeb:
nuqneH
/[^0-9]{3,}/g.test(string);
[^0-9]{3,}
liefert nicht Nicht-Vorkommen von mindestens 3 Ziffern hintereinander, sondern Vorkommen von mindestens 3 Nicht-Ziffern hintereinander.
Suche nach [0-9]{3,}
a/k/a [\d]{3,}
und negiere deine Bedingung.
Qapla'
Tja manchmal sitzt man eben einfach aufm Schlauch ;-)
Danke euch!
Hi,
Suche nach
[0-9]{3,}
a/k/a[\d]{3,}
NEIN! Das ist NICHT a/k/a!
\d ist nicht dasselbe wie [0-9] (\d matcht alle Dezimal-Ziffern, nicht nur die ASCII-Dezimal-Ziffern, also z.B. auch die bengalischen ab \u09E6)
(oder ist das in Javascript anders als in Perl?).
Abgesehen davon: Warum packst Du \d in eine Zeichenklasse? \d matcht schon ganz alleine Ziffern.
Und warum {3,} statt 3?
Wenn mehr als drei aufeinanderfolgende Ziffern im String enthalten sind, findet \d{3} die ersten 3 davon. test() findet also den Treffer, mit Negierung wird dieser String dann also von domeb als unpassend aussortiert.
Da es hier ja gar nicht um den Suchtreffer-String (welcher Teil des Strings wurde gematcht) geht, sondern nur darum, *ob* 3 (oder mehr) aufeinanderfolgende Ziffern vorhanden sind, ist {3} ausreichend. Und ggf. deutlich effizienter. Stell Dir vor, der String hätte ein paar Tausend aufeinanderfolgende Ziffern - mit {3} kann nach 3 Ziffern abgebrochen werden. Mit {3,} müssen alle Ziffern aufgesammelt werden (um ggf. später den getroffenen String weiterzubearbeiten) ...
cu,
Andreas
NEIN! Das ist NICHT a/k/a!
\d ist nicht dasselbe wie [0-9] (\d matcht alle Dezimal-Ziffern, nicht nur die ASCII-Dezimal-Ziffern, also z.B. auch die bengalischen ab \u09E6)
(oder ist das in Javascript anders als in Perl?).
Das kommt auf die Implementierung der PCRE-Engine an - allein die Unterschiede bei \w sind zwischen den Implementierungen schon stark unterschiedlich - ich weiß zwar nicht, wie es hier um JavaScript bestellt ist, aber eine Pauschalaussage kann man sicher nicht treffen.
Abgesehen davon: Warum packst Du \d in eine Zeichenklasse? \d matcht schon ganz alleine Ziffern.
Das hat mich auch gewundert.
Und warum {3,} statt 3?
Weil {3,} etwas anderes als {3} ist - in diesem Fall ist es, da der Ausdruck hier zu Ende ist, völlig egal.
Wenn mehr als drei aufeinanderfolgende Ziffern im String enthalten sind, findet \d{3} die ersten 3 davon. test() findet also den Treffer, mit Negierung wird dieser String dann also von domeb als unpassend aussortiert.
Da es hier ja gar nicht um den Suchtreffer-String (welcher Teil des Strings wurde gematcht) geht, sondern nur darum, *ob* 3 (oder mehr) aufeinanderfolgende Ziffern vorhanden sind, ist {3} ausreichend. Und ggf. deutlich effizienter. Stell Dir vor, der String hätte ein paar Tausend aufeinanderfolgende Ziffern - mit {3} kann nach 3 Ziffern abgebrochen werden. Mit {3,} müssen alle Ziffern aufgesammelt werden (um ggf. später den getroffenen String weiterzubearbeiten) ...
Wenn die Ziffern z.B. durch Whitespace-Zeichen begrenzt sind, sist \s\d{3,}\s etwas völlig anderes als \s\d{3}\s
Hi,
Und warum {3,} statt {3}?
Weil {3,} etwas anderes als {3} ist
hab ich auch nicht behauptet, daß das identisch ist.
- in diesem Fall ist es, da der Ausdruck hier zu Ende ist, völlig egal.
Nein. Ist nicht egal. Beides ist *hier* effektiv, aber unterschiedlich effizient.
Aber das schrieb ich ja schon.
Wenn die Ziffern z.B. durch Whitespace-Zeichen begrenzt sind, sist \s\d{3,}\s etwas völlig anderes als \s\d{3}\s
Und X ist etwas völlig anderes als U.
cu,
Andreas
Und warum {3,} statt {3}?
Weil {3,} etwas anderes als {3} ist
hab ich auch nicht behauptet, daß das identisch ist.
Ja ;)
- in diesem Fall ist es, da der Ausdruck hier zu Ende ist, völlig egal.
Nein. Ist nicht egal. Beides ist *hier* effektiv, aber unterschiedlich effizient.
Aber das schrieb ich ja schon.
Ja, aber in einer Wall of Text wo idR. ein "TL;DR" einsetzt :)
Wenn die Ziffern z.B. durch Whitespace-Zeichen begrenzt sind, sist \s\d{3,}\s etwas völlig anderes als \s\d{3}\s
Und X ist etwas völlig anderes als U.
Es wollte dir auch keiner ein X für ein U vormachen :p
Hallo,
Aber das schrieb ich ja schon.
Ja, aber in einer Wall of Text wo idR. ein "TL;DR" einsetzt :)
dann ist dein Limit aber extrem niedrig. Die Textmenge, die Andreas hier anbietet, ist etwa ein Drittel bis die Häffte dessen, wo ich überhaupt auf die Idee komme, abzubrechen. Normalerweise halte ich ein bis zwei Bildschirmseiten durchaus für angemessen - wenn's nicht nur leeres Gefasel ist.
Außer es geht um ein Thema, das mich grundsätzlich nicht interessiert. Dann fange ich aber gar nicht erst an zu lesen.
Ciao,
Martin
Aber das schrieb ich ja schon.
Ja, aber in einer Wall of Text wo idR. ein "TL;DR" einsetzt :)dann ist dein Limit aber extrem niedrig.
Ich sprach nicht von meinem Limit, ich bezog mich auf das Limit as derjenige haben wird, der das vielleicht mal im Archiv findet - oder ganz einfach der OP, dessen Limit ich nicht kenne.
Hi,
Und warum {3,} statt 3?
Korrektur:
Und warum {3,} statt {3} ?
(absichtlich geplenkt, damit das ? nicht als Regex-Quantifier mißverstanden wird.
cu,
Andreas
\d ist nicht dasselbe wie [0-9] (\d matcht alle Dezimal-Ziffern, nicht nur die ASCII-Dezimal-Ziffern, also z.B. auch die bengalischen ab \u09E6)
(oder ist das in Javascript anders als in Perl?).
http://es5.github.com/#x15.10.2.12
Mathias
Hi,
\d ist nicht dasselbe wie [0-9] (\d matcht alle Dezimal-Ziffern, nicht nur die ASCII-Dezimal-Ziffern, also z.B. auch die bengalischen ab \u09E6)
(oder ist das in Javascript anders als in Perl?).
Ok, in Javascript ist [0-9] also identisch zu \d.
Dann gilt mein diesbezüglicher Hinweis eben nur für den Fall, daß man den Regex in einen anderen Kontext als Javascript bringt ...
cu,
Andreas
@@MudGuard:
nuqneH
NEIN! Das ist NICHT a/k/a!
Puh, da hab ich ja nochmal Glück gehabt, dass es in JavaScript doch a/k/a ist. ;-) Aber …
\d ist nicht dasselbe wie [0-9] (\d matcht alle Dezimal-Ziffern, nicht nur die ASCII-Dezimal-Ziffern, also z.B. auch die bengalischen ab \u09E6)
… danke für den Hinweis.
Abgesehen davon: Warum packst Du \d in eine Zeichenklasse? \d matcht schon ganz alleine Ziffern.
Da hast du unzweifelhaft recht.
[…] nur darum, *ob* 3 (oder mehr) aufeinanderfolgende Ziffern vorhanden sind, ist {3} ausreichend. Und ggf. deutlich effizienter.
Und da auch.
Qapla'
Hi,
Da hast du unzweifelhaft recht.
Ich habe immer ...
... mal wieder Recht ;-)
cu,
Andreas