【发布时间】:2012-03-29 11:05:00
【问题描述】:
我正在尝试使用正则表达式来匹配诸如(letter(letter|number))* 之类的模式,我的意思是一个无限长的字符串,但具有“以字母开头,然后是字母或数字”规则。
所以我在 clojure 中使用了这种模式 #"\w+[\w|\d]*",但如果我只使用它验证的数字,就像下面的代码一样,我做错了什么?
(re-matches #"\w+[\w|\d]*" "1")
【问题讨论】:
我正在尝试使用正则表达式来匹配诸如(letter(letter|number))* 之类的模式,我的意思是一个无限长的字符串,但具有“以字母开头,然后是字母或数字”规则。
所以我在 clojure 中使用了这种模式 #"\w+[\w|\d]*",但如果我只使用它验证的数字,就像下面的代码一样,我做错了什么?
(re-matches #"\w+[\w|\d]*" "1")
【问题讨论】:
对于您提出的问题,其他答案看起来不错,但听起来您确实可能希望验证标识符。请注意,Java API 提供了一些有用的实用方法来做到这一点。有时明确比正则表达式更好。
例如
(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)))
【讨论】:
标记\w 匹配字母和数字。来自the documentation:
\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]
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
因此,将您的正则表达式更改为:[a-zA-Z]\w*
【讨论】:
\w 只用于字母=S
_ 和 $。