繁体   English   中英

Clojure / Java中的模式匹配

[英]Pattern matching in Clojure/Java

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

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

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

令牌\\w匹配字母和数字。 文档

\\w一个字符:[a-zA-Z_0-9]

使用[az]\\p{Lower}\\p{Upper}\\p{Alpha}作为字母:

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

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

其他答案对于您提出的问题看起来很好,但听起来您可能真的想要验证标识符。 请注意,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匹配字母或数字:

\\ w一个字符:[a-zA-Z_0-9]

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

所以将你的正则表达式改为: [a-zA-Z]\\w*

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM