我试图使用正则表达式来匹配(letter(letter|number))*
之类的模式,我的意思是一个字符串,其长度无限但是带有一个"以字母开头,那么就是一个字母或者一个数字"规则。
所以我在clojure中使用了这个模式#"\w+[\w|\d]*"
,但如果我只使用一个数字验证,就像下面的代码一样,我做错了什么?
(re-matches #"\w+[\w|\d]*" "1")
答案 0 :(得分:5)
令牌\w
匹配字母和数字。来自the documentation:
\w
一个单词字符:[a-zA-Z_0-9]
使用[a-z]
,\p{Lower}
,\p{Upper}
或\p{Alpha}
代码:
[a-z][a-z0-9]*
(另请注意,+
没有任何区别。)
答案 1 :(得分:5)
其他答案对于您提出的问题看起来很好,但听起来您可能真的想要验证标识符。请注意,Java API提供了一些有用的实用方法来实现这一点。有时显性比正则表达更好。
e.g。
(defn identifier? [s]
(and (Character/isJavaIdentifierStart (first s))
(empty? (remove #(Character/isJavaIdentifierPart %) (rest s)))))
在java 6及更高版本中,您可以这样做:
(defn identifier? [s]
(and (not (javax.lang.model.SourceVersion/isKeyword s))
(javax.lang.model.SourceVersion/isIdentifier s)))
答案 2 :(得分:4)
\w
匹配字母或数字:
\ w单词字符:[a-zA-Z_0-9]
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
因此,请将您的正则表达式更改为:[a-zA-Z]\w*