Регулярное выражение для проверки начинается с http://, https:// или ftp://

Я создаю регулярное выражение, чтобы проверить, начинается ли слово с http:// или https:// или ftp://, мой код выглядит следующим образом:

     public static void main(String[] args) {
    try{
        String test = "http://yahoo.com";
        System.out.println(test.matches("^(http|https|ftp)://"));
    } finally{

    }
}

Он печатает false. Я также проверил сообщение stackoverflow https://stackoverflow.com/questions/4643142/regex-to-test-if-string-begins-with-http-or-https

Регулярное выражение кажется правильным, но почему оно не совпадает? Я даже пробовал ^(http|https|ftp)\:// и ^(http|https|ftp)\\://


person Abhishek    schedule 09.11.2011    source источник
comment
Почему регулярное выражение? Почему бы не попытаться создать URL или URI и получить протокол?   -  person user207421    schedule 09.11.2011


Ответы (5)


Здесь вам нужно совпадение полного ввода.

System.out.println(test.matches("^(http|https|ftp)://.*$")); 

Изменить: (на основе комментария @davidchambers)

System.out.println(test.matches("^(https?|ftp)://.*$")); 
person Prince John Wesley    schedule 09.11.2011
comment
Вы также можете использовать (https?|ftp), если хотите. - person davidchambers; 09.11.2011
comment
@davidchambers: +1. цель состоит в том, чтобы сообщить, что метод matches будет соответствовать всему вводу. я обновлю ваш ввод - person Prince John Wesley; 09.11.2011
comment
Вы закончили с .*$ Не могли бы вы уточнить, что это значит (я понимаю, что это вся строка, но на простом английском языке, как бы вы объяснили .*$ спасибо! - person adhg; 22.03.2017
comment
@adhg $ указывает на конец строки. .* соответствует любому символу ноль или более раз. - person Prince John Wesley; 23.03.2017

Если нет веских причин для использования регулярного выражения, я бы просто использовал String.startsWith:

bool matches = test.startsWith("http://")
            || test.startsWith("https://") 
            || test.startsWith("ftp://");

Я не удивлюсь, если это тоже быстрее.

person Randall Cook    schedule 09.11.2011
comment
Я был бы удивлен, если бы это не было медленнее (по сравнению с скомпилированным регулярным выражением), но нужно проверить, чтобы узнать. - person Joel; 17.11.2015

Если вы хотите сделать это без учета регистра, это лучше:

System.out.println(test.matches("^(?i)(https?|ftp)://.*$")); 
person user1079877    schedule 09.09.2014

Я думаю, что решения для синтаксического анализа регулярных выражений/строк великолепны, но для этого конкретного контекста кажется, что имеет смысл просто использовать анализатор URL-адресов java:

https://docs.oracle.com/javase/tutorial/networking/urls/urlInfo.html

Взято с той страницы:

import java.net.*;
import java.io.*;

public class ParseURL {
    public static void main(String[] args) throws Exception {

        URL aURL = new URL("http://example.com:80/docs/books/tutorial"
                           + "/index.html?name=networking#DOWNLOADING");

        System.out.println("protocol = " + aURL.getProtocol());
        System.out.println("authority = " + aURL.getAuthority());
        System.out.println("host = " + aURL.getHost());
        System.out.println("port = " + aURL.getPort());
        System.out.println("path = " + aURL.getPath());
        System.out.println("query = " + aURL.getQuery());
        System.out.println("filename = " + aURL.getFile());
        System.out.println("ref = " + aURL.getRef());
    }
}

дает следующее:

protocol = http
authority = example.com:80
host = example.com
port = 80
path = /docs/books/tutorial/index.html
query = name=networking
filename = /docs/books/tutorial/index.html?name=networking
ref = DOWNLOADING
person gdiz    schedule 11.05.2018

Метод test.matches() проверяет все text.use test.find()

person shift66    schedule 09.11.2011