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)))