Clojure / Java中的模式匹配

时间:2012-03-29 11:05:00

标签: java regex clojure

我试图使用正则表达式来匹配(letter(letter|number))*之类的模式,我的意思是一个字符串,其长度无限但是带有一个"以字母开头,那么就是一个字母或者一个数字"规则。

所以我在clojure中使用了这个模式#"\w+[\w|\d]*",但如果我只使用一个数字验证,就像下面的代码一样,我做错了什么?

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

3 个答案:

答案 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*