Регулярное выражение Python для имен пакетов Java - PullRequest
6 голосов
/ 26 августа 2010

У меня проблемы с определением допустимых имен пакетов Java с использованием Python. Вот код:

    packageName = "com.domain.lala" # valid, not rejected -> correct
    #packageName = ".com.domain.lala" # invalid, rejected -> correct
    #packageName = "com..domain.lala" # invalid, not rejected -> incorrect
    #packageName = "com.domain.lala." # invalid, not rejected -> incorrect

    matchObject = re.match("([a-z_]{1}[a-z0-9_]*(\.[a-z_]{1}[a-z0-9_]*)*)",
                           packageName)

    if matchObject is not None:
        print packageName + " is a package name!"
    else:
        print packageName + " is *not* a package name!"
        Utilities.show_error("Invalid Package Name", "Invalid package name " + packageName + "!", "Ok", "", "")

Имена пакетов должны начинаться со строчной буквы или подчеркивания, и после каждой точки должна следовать хотя бы одна строчная буква или подчеркивание снова. Все остальные символы могут быть строчными буквами, цифрами или подчеркиванием. Запрещается запускать точки, и они не могут заканчиваться или начинаться с точки.

Как мне решить эту проблему?

Ответы [ 5 ]

4 голосов
/ 26 августа 2010

Добавьте $ в конце регулярного выражения для принудительного совпадения полной строки.В данный момент он соответствует только частичной строке, поэтому он неправильно принимает допустимые имена пакетов с добавленным мусором в конце.

3 голосов
/ 03 мая 2012

Буквы верхнего регистра фактически разрешены в именах пакетов Java. Они просто обескуражены, но это работает.

Регулярное выражение должно быть:

^([a-zA-Z_]{1}[a-zA-Z0-9_]*(\\.[a-zA-Z_]{1}[a-zA-Z0-9_]*)*)?$
2 голосов
/ 31 января 2014

Следующая схема хорошо сработала для меня:

/^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+[0-9a-z_]$/i;

Результаты можно найти в этом gist .

[✔] me.unfollowers.droid
[✔] me_.unfollowers.droid
[✔] me._unfollowers.droid
[✔] me.unfo11llowers.droid
[✔] me11.unfollowers.droid
[✔] m11e.unfollowers.droid
[✗] 1me.unfollowers.droid
[✔] me.unfollowers23.droid
[✔] me.unfollowers.droid23d
[✔] me.unfollowers_.droid
[✔] me.unfollowers._droid
[✔] me.unfollowers_._droid
[✔] me.unfollowers.droid_
[✔] me.unfollowers.droid32
[✗] me.unfollowers.droid/
[✗] me:.unfollowers.droid
[✗] :me.unfollowers.droid
[✗] me.unfollowers.dro;id
[✗] me.unfollowe^rs.droid
[✗] me.unfollowers.droid.
[✗] me.unfollowers..droid
[✗] me.unfollowers.droid._
[✔] me.unfollowers.11212
[✔] me.1.unfollowers.11212
[✗] me..unfollowers.11212
[✗] abc
[✗] abc.
[✗] .abc
2 голосов
/ 26 августа 2010

Вам нужно поставить маркеры начала и конца строки.Таким образом, регулярное выражение должно выглядеть следующим образом -

^([a-z_]{1}[a-z0-9_]*(\.[a-z_]{1}[a-z0-9_]*)*)$
0 голосов
/ 26 августа 2010

Вместо этого вы можете разобрать строку:

def valid_java_package_name(string):
    tree = string.split('.')

    if len(tree) == 0:
        return false

    for node in tree:
        if not valid_java_package_node(node):
            return false

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