Как я могу проверить URL (домен), разрешающий подстановочный знак (*,%) в Java - PullRequest
0 голосов
/ 21 мая 2018

Я хочу проверить URL проверки с разрешением подстановочного знака в Java.

Я нашел несколько хороших примеров проверки URL в Java ( REGEX , urlValidator ), но этине предоставляют подстановочный знак.

Вот что я практикую:

CODE (urlValidator)

public void urlValidiTest(){
    System.out.println(this.urlCheck("https://www.google.com"));
    System.out.println(this.urlCheck("https://google.com"));
    System.out.println(this.urlCheck("*.com"));
}

public boolean urlCheck(String url){
    return new UrlValidator().isValid(url);
}

OUTPUT

true

true

false

CODE (regex)

public void regexTest() {
  String[] URLs = new String[] { "http://www.google.com", "http://google.com/","*.com" };
    Pattern REGEX = Pattern.compile("(?i)^(?:(?:https?|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?$");
    for (String url : URLs) {
        Matcher matcher = REGEX.matcher(url);
        if (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

RESULT

http://www.google.com

http://google.com/

Все, что я хочу сделать, это действительный URL-адрес.

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

Любой комментарий будет оценен.Спасибо.

ОБНОВЛЕНИЯ

Я избавился от части схемы и добавил | * и | \. * К части домена после ответа (| * и |.* выдает ошибку - недопустимая escape-последовательность (допустимыми являются \ b \ t \ n \ f \ r \ "\ ') - но я не уверен, что изменения правильные).

Теперь это нене разрешать "google.com", но разрешать другим ("www.google.com", "google.com", ".google.com", ".com")

 public void regexValidator(String str){

    Pattern REGEX = Pattern.compile(""
            + "(?i)^(?:\\S+(?::\\S*)?@)"
            + "?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)"
            + "(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])"
            + "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|"

            //DOMAIN
            + "(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+|\\*)"
            + "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*"
            //

            + "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))\\.?)"
            + "(?::\\d{2,5})?(?:[/?#]\\S*)?$");

    Matcher _matcher = REGEX.matcher(str);
    if(_matcher.find()){
        System.out.println("[O] " + str);
    }
    else {
        System.out.println("[X]" + str);
    }
}

public void validate(){
    System.out.println("TEST START");
    this.regexValidator("https://www.google.com");
    this.regexValidator("www.google.com");
    this.regexValidator("google.com");
    this.regexValidator("*.google.com");
    this.regexValidator("*.com");
    System.out.println("DONE");
}

ПУСК ТЕСТА

[X] https://www.google.com

[O] www.google.com

[O] google.com

[O]* .google.com

[O] * .com

Совершено

Нужна помощь. Спасибо.

1 Ответ

0 голосов
/ 21 мая 2018

Возьмите это с крошкой соли, у меня сейчас нет доступа к Java, и я сделал это изо всех сил, поэтому, если здесь есть ошибки, не стесняйтесь исправлять меня.

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

Давайте сначала разберем имеющееся у вас регулярное выражение:

(?i)
^
    (?:
        (?:
            https?|ftp
        )
        ://
    )
    (?:
        \S+
        (?:
            :\S*
        )?
        @
    )?
    (?:
        (?!
            (?:
                10|127
            )
            (?:
                \.\d{1,3}
            ){3}
        )
        (?!
            (?:
                169\.254|192\.168
            )
            (?:
                \.\d{1,3}
            ){2}
        )
        (?!
            172\.
            (?:
                1[6-9]|2\d|3[0-1]
            )
            (?:
                \.\d{1,3}
            ){2}
        )
        (?:
            [1-9]\d?|1\d\d|2[01]\d|22[0-3]
        )
        (?:
            \.
            (?:
                1?\d{1,2}|2[0-4]\d|25[0-5]
            )
        ){2}
        (?:
            \.
            (?:
                [1-9]\d?|1\d\d|2[0-4]\d|25[0-4]
            )
        )
        |
        (?:
            (?:
                [a-z\u00a1-\uffff0-9]-*
            )*
            [a-z\u00a1-\uffff0-9]+
        )
        (?:
            \.
            (?:
                [a-z\u00a1-\uffff0-9]-*
            )*
            [a-z\u00a1-\uffff0-9]+
        )*
        (?:
            \.
            (?:
                [a-z\u00a1-\uffff]{2,}
            )
        )
        \.?
    )
    (?:
        :\d{2,5}
    )?
    (?:
        [/?#]\S*
    )?
$

Теперь мы можем видеть, что есть группы длясхема, пара имя пользователя / пароль (группа с символом @), большая группа для самого домена и группа для порта и одна для возможных частей пути, запроса или фрагмента.Большая группа может быть разбита на две части (разделенные | (ИЛИ)), первая для IP-адресов, с отрицательным взглядом на будущее, чтобы запретить локальные IP-адреса, и последняя для именованных доменов, состоящих из одного или несколькихчасти, разделенные точкой и, наконец, TLD.

Итак, что вам нужно сделать, чтобы разрешить использование подстановочных знаков? Добавить подстановочный знак (* или %) в каждой группе, котораявы хотите разрешить замену подстановочным знаком:

Если вы хотите разрешить подстановочный знак для схемы , добавьте его здесь:

    (?:
        (?:
            https?|ftp
            |\*    <-----
        )
        ://
    )

Если вы хотитечтобы разрешить использование подстановочных знаков для имени пользователя и / или пароля , вам не нужно ничего делать, ваше регулярное выражение уже допускает любые непробельные символы, поэтому *:*@ или *@ уже действительны.

Если вы хотите разрешить символы подстановки для доменного имени , добавьте их здесь:

        (?:
            (?:
                [a-z\u00a1-\uffff0-9]-*
            )*
            [a-z\u00a1-\uffff0-9]+
            |\*    <-----
        )
        (?:
            \.
            (?:
                [a-z\u00a1-\uffff0-9]-*
            )*
            [a-z\u00a1-\uffff0-9]+
            |\.\*    <-----
        )*

Если вы хотите разрешить символы подстановки для TLD , добавьте один здесь:

        (?:
            \.
            (?:
                [a-z\u00a1-\uffff]{2,}
                |\*    <-----
            )
        )

Если вы хотите разрешить подстановочный знак для порт , добавьте его здесь:

    (?:
        :\d{2,5}
        |:\*    <-----
    )?

Если вы хотите разрешить подстановочный знак для путей , вам не нужно ничего делать, уже охваченных вашимрегулярные выражения (/* и /*/*/foobar и т. д. уже действительны).

И последнее, но не менее важное, если вы хотите разрешить подстановочные знаки для схемы и доменного имени вместе (как вваш пример), вам нужно добавить новую группу и ИЛИ ее в:

    |
    (?:
        \*
        \.
        (?:
            [a-z\u00a1-\uffff]{2,}
        )
    )
    (?:
        :\d{2,5}
    )?
    (?:
        [/?#]\S*
    )?

В основном просто добавьте это за последней группой и перед символом $.Не забудьте добавить здесь подстановочный знак в TLD и / или порт, если вы этого хотите.

...