2012-03-29 18 views
2

Ich versuche eine Regex zu verwenden, um ein Muster wie (letter(letter|number))*, ich meine eine Zeichenfolge mit unendlicher Länge aber mit einem "Start mit einem Buchstaben, dann sei ein Buchstabe oder eine Zahl" Regel.Mustervergleich in Clojure/Java

Also benutze ich dieses Muster #"\w+[\w|\d]*" in clojure, aber wenn ich nur eine Nummer verwendet validiert es, genau wie der Code unten, was mache ich falsch?

(re-matches #"\w+[\w|\d]*" "1") 

Antwort

5

Die anderen Antworten sehen gut für die Frage aus, die Sie gefragt haben, aber es klingt, als ob Sie wirklich versuchen würden, Identifikatoren zu überprüfen. Beachten Sie, dass die Java-API einige nützliche Hilfsmethoden bereitstellt, um genau dies zu tun. Manchmal ist das Explizieren besser als eine Regex.

z.B.

(defn identifier? [s] 
    (and (Character/isJavaIdentifierStart (first s)) 
     (empty? (remove #(Character/isJavaIdentifierPart %) (rest s))))) 

in Java 6 und später können Sie dies tun:

(defn identifier? [s] 
    (and (not (javax.lang.model.SourceVersion/isKeyword s)) 
     (javax.lang.model.SourceVersion/isIdentifier s))) 
5

Die Token \w Matches beide Buchstaben und Zahlen. Von the documentation:

\w             Ein Wortzeichen: [a-zA-Z_0-9]

Verwenden [a-z], \p{Lower}, \p{Upper} oder \p{Alpha} für Briefe:

[a-z][a-z0-9]* 

(Beachten Sie auch, dass die + macht keinen Unterschied machen)

4

\w Streichhölzer Buchstaben oder Ziffern.

\ w Wortzeichen: [a-zA-Z_0-9]

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

So ändern Sie Ihre Regex zu: [a-zA-Z]\w*

+0

Dankten, dachte ich '\ W 'für Briefe nur war = S –

+0

"Wort" Zeichen sind nicht wirklich gedacht für Worte, sie sollen gültige Zeichen in "Bezeichnern" in Java/c-Stilsprachen –

+0

@JoostDiepenmaat entsprechen, nicht wirklich, da diese normalerweise zum Beispiel "_" und "$" beinhalten. – aioobe