Clojure/Java中的模式匹配

Clojure/Java中的模式匹配,java,regex,clojure,Java,Regex,Clojure,我试图使用正则表达式来匹配一个模式,比如(字母(字母|数字))*,我指的是一个无限长的字符串,但带有“以字母开头,然后是字母或数字”规则 所以我在clojure中使用了这个模式#“\w+[\w|\d]*”,但是如果我只使用一个数字进行验证,就像下面的代码一样,我做错了什么 (re-matches #"\w+[\w|\d]*" "1") 令牌\w同时匹配字母和数字。发件人: \w一个单词字符:[A-zA-Z_0-9] 对字母使用[a-z],\p{Lower},\p{Upper}或\p{Alpha

我试图使用正则表达式来匹配一个模式,比如
(字母(字母|数字))*
,我指的是一个无限长的字符串,但带有“以字母开头,然后是字母或数字”规则

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

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

令牌
\w
同时匹配字母和数字。发件人:

\w
一个单词字符:[A-zA-Z_0-9]

对字母使用
[a-z]
\p{Lower}
\p{Upper}
\p{Alpha}

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

(另外,请注意,
+
没有区别。)

\w
匹配字母或数字:

\w一个单词字符:[A-zA-Z_0-9]


因此,将您的正则表达式更改为:
[a-zA-Z]\w*

对于您提出的问题,其他答案看起来不错,但听起来您可能真的希望验证标识符。请注意,JavaAPI提供了一些有用的实用方法来实现这一点。有时候,显式比正则表达式好

e、 g

在java 6及更高版本中,您可以执行以下操作:

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

谢谢,我认为
\w
只用于字母=s的“单词”字符并不是真正用于单词,而是用于匹配java/c样式的“标识符”中的有效字符languages@JoostDiepenmaat,不是真的,因为这些通常包括例如
\uuu
$
\w匹配项,以及$(可能?)不是C中的合法标识符字符。我怀疑\w与合法C标识符匹配。
(defn identifier? [s]
    (and (not (javax.lang.model.SourceVersion/isKeyword s))
         (javax.lang.model.SourceVersion/isIdentifier s)))