2010-09-30 22 views
23

übereinstimmen Ist es möglich, einen regulären Ausdruck zu schreiben, der alle Zeichenfolgen entspricht, die nicht nur enthält Zahlen? Wenn wir diese Strings:Regex: Wie eine Zeichenfolge, die nicht nur Zahlen ist

  • abc
  • a4c
  • 4bc
  • ab4

Es sollte t entsprechen er vier zuerst, aber nicht der letzte. Ich habe versucht, in RegexBuddy mit Lookaheads und anderem herumzuspielen, aber ich kann es nicht herausfinden.

Antwort

31
(?!^\d+$)^.+$ 

Dies sagt Lookahead für Zeilen, die nicht alle Ziffern enthalten und die gesamte Zeile übereinstimmen.

+0

Das ist im Grunde, was ich mit :) – Svish

+1

So ... im Grunde kam Sie mit einem komplizierten Ausdruck für/\ D /. –

+1

Nun nein \ D ist anders als meins, weil es nur nicht Ziffern entspricht. Mine gibt Übereinstimmungen zurück, die die gesamte Zeichenfolge enthalten, wenn eine Übereinstimmung hergestellt wird, während \ D mehrere Übereinstimmungen pro Zeile sein können. Meine Regex gibt 4 Übereinstimmungen zurück, während \ D 17 zurückgibt (für jede Nicht-Ziffer). –

5
/^\d*[a-z][a-z\d]*$/ 

Mai eine Ziffer am Anfang sein, dann mindestens ein Buchstabe, dann Buchstaben oder Ziffern

+2

Dies ist bei weitem die einfachste zu lesen und zu verstehen. – enyo

9

Es sei denn, ich bin etwas fehle, ich denke, das prägnanteste regex ist ...

/\D/ 

... oder mit anderen Worten, gibt es eine Nicht-Ziffer in der Zeichenfolge?

+0

dies wird fehlschlagen, wenn es eine Ziffer in der Zeichenfolge gibt, soweit ich sehen kann – Svish

+0

@Swish: Ihre Aussage macht keinen Sinn. – SilentGhost

+0

@Swish, vielleicht solltest du es tatsächlich ausprobieren, bevor du etwas sagst. Es ist viel prägnanter als die Antwort, die Sie ausgewählt haben, und es funktioniert. Es wird nicht fehlschlagen, wenn Ziffern in der Zeichenfolge enthalten sind, es wird nur fehlschlagen, wenn es keine "Nicht-Ziffer" findet, was genau das ist, was Sie gefragt haben. –

2

Da sagte man "Spiel", nicht nur bestätigen, wird die folgende Regex korrekt

\b.*[a-zA-Z]+.*\b 

Passing Tests übereinstimmen:

abc 
a4c 
4bc 
ab4 
1b1 
11b 
b11 

Failing Tests:

123 
+0

Könnte '\ b. * \ D +. * \ B' auch funktionieren? –

+1

@Jin, hängt ab, '[a-zA-Z]' ist nicht dasselbe wie '\ D'. '\ D' ist" keine Ziffer ". Also, wenn sie buchstäblich nicht wollen 0-9 und sind in Ordnung mit Interpunktion, dann ja, '\ D 'wäre genauer. – CaffGeek

6

jjnguy hatte es in einerkorrekt (wenn auch etwas überflüssig).

.*?[^0-9].* 

@Chad, Ihre regex,

\b.*[a-zA-Z]+.*\b 

wahrscheinlich nicht Buchstaben zulassen sollte (zB Zeichensetzung), obwohl Beispiele der Svish keiner enthielt. Svishs primäre Anforderung war: Nicht alle sind Ziffern.

\b.*[^0-9]+.*\b 

Dann brauchen Sie nicht die + dort, da alles, was Sie brauchen, 1 Nicht-Ziffer zu gewährleisten, ist da drin ist (mehr könnte drin sein, wie durch die abgedeckt. * An den Enden).

\b.*[^0-9].*\b 

Als Nächstes können Sie mit dem \ b an beiden Enden abschaffen, da diese unnötigen Beschränkungen sind (Referenz Aufruf alphanum und _).

.*[^0-9].* 

Schließlich ist zu beachten, dass dieser letzte regex zeigt, dass das Problem nur mit den Grundlagen gelöst werden kann, diese Grundlagen, die seit Jahrzehnten bestanden haben (zB keine Notwendigkeit für die Look-Ahead-Funktion). Im Englischen war die Frage logisch gleichbedeutend mit der einfachen Frage, ob 1 Gegenbeispielzeichen in einer Zeichenkette gefunden wurde.

Wir können diese Regex in einem Browser testen, indem Sie Folgendes in die Adresszeile kopieren und die Zeichenfolge "6576576i7567" durch die Zeichenfolge ersetzen, die Sie testen möchten.

javascript:alert(new String("6576576i7567").match(".*[^0-9].*")); 
0

Wenn wir gültige Zeichen beschränken möchten, so dass String kann aus einer begrenzten Anzahl von Zeichen bestehen, versuchen Sie dies:

(?!^\d+$)^[a-zA-Z0-9_-]{3,}$ 

oder

(?!^\d+$)^[\w-]{3,}$ 

/\ w + /: Entspricht einem beliebigen Buchstaben, einer Zahl oder einem Unterstrich. jedes Wort Charakter

2

Try this:

/^.*\D+.*$/ 

Es true zurück, wenn es eine simbol ist, dass keine Zahl ist. Funktioniert gut mit allen Sprachen.

2

wenn Sie versuchen, Welten zu entsprechen, die mindestens einen Buchstaben haben, aber sie werden durch Zahlen und Buchstaben (oder nur Buchstaben) gebildet wird, ist es das, was ich verwendet habe:

(\d*[a-zA-Z]+\d*)+ 
Verwandte Themen