Сопоставление с образцом в Clojure / Java - PullRequest
2 голосов
/ 29 марта 2012

Я пытаюсь использовать регулярное выражение для сопоставления с шаблоном, например (letter(letter|number))*, я имею в виду строку с бесконечной длиной, но с правилом «начинай с буквы, затем будь либо буква, либо число».

Итак, я использую этот шаблон #"\w+[\w|\d]*" в ближайшем будущем, но если я использую только число, которое он проверяет, как и приведенный ниже код, что я делаю неправильно?

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

Ответы [ 3 ]

5 голосов
/ 29 марта 2012

Другие ответы выглядят хорошо для вашего вопроса, но, похоже, вы действительно хотите проверить идентификаторы.Обратите внимание, что 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)))
5 голосов
/ 29 марта 2012

Маркер \w соответствует буквам и цифрам. Из документации :

\w Символ слова: [a-zA-Z_0-9]

Используйте [a-z], \p{Lower}, \p{Upper} или \p{Alpha} для букв:

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

(Также обратите внимание, что + не имеет значения.)

4 голосов
/ 29 марта 2012

\w соответствует буквам или цифрам:

\ w Символ слова: [a-zA-Z_0-9]

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

Поэтому измените свойregex to: [a-zA-Z]\w*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...