Clojure/Java中的模式匹配

Jon*_*oso 2 java regex clojure

我正在尝试使用正则表达式来匹配一个模式,例如(letter(letter|number))*,我的意思是一个字符串,其长度无限但是带有"以字母开头,然后是字母或数字"规则.

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

(re-matches #"\w+[\w|\d]*" "1")
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 5

令牌\w匹配字母和数字.从文档:

\w      单词字符:[a-zA-Z_0-9]

使用[a-z],\p{Lower},\p{Upper}\p{Alpha}信件:

[a-z][a-z0-9]*
Run Code Online (Sandbox Code Playgroud)

(另请注意,这+并没有什么区别.)


sw1*_*1nn 5

其他答案对于您提出的问题看起来很好,但听起来您可能真的想要验证标识符.请注意,Java API提供了一些有用的实用方法来实现这一点.有时显性比正则表达更好.

例如

(defn identifier? [s]
    (and (Character/isJavaIdentifierStart (first s))
         (empty? (remove #(Character/isJavaIdentifierPart %) (rest s)))))
Run Code Online (Sandbox Code Playgroud)

在java 6及更高版本中,您可以这样做:

(defn identifier? [s]
    (and (not (javax.lang.model.SourceVersion/isKeyword s))
         (javax.lang.model.SourceVersion/isIdentifier s)))
Run Code Online (Sandbox Code Playgroud)