【问题标题】:Pattern matching in Clojure/JavaClojure/Java 中的模式匹配
【发布时间】:2012-03-29 11:05:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: java regex clojure


    【解决方案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)))
    

    【讨论】:

      【解决方案2】:

      标记\w 匹配字母和数字。来自the documentation

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

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

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

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

      【讨论】:

        【解决方案3】:

        \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
        • "word" 字符并非真正用于单词,它们旨在匹配 java/c 样式语言中“标识符”中的有效字符
        • @JoostDiepenmaat,并非如此,因为这些通常包括 _$
        • \w 匹配 _,并且 $(可能?)不是 C 中的合法标识符字符。我怀疑 \w 匹配合法的 C 标识符。
        猜你喜欢
        • 1970-01-01
        • 2012-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-02
        • 2012-04-14
        • 1970-01-01
        相关资源
        最近更新 更多