java 要检查的正则表达式以http://、https://或ftp://开头

zysjyyx4  于 2023-01-07  发布在  Java
关注(0)|答案(6)|浏览(324)

我构造了一个正则表达式来检查一个单词是以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 post Regex to test if string begins with http:// or https://
正则表达式似乎是正确的,但为什么它不匹配?。我甚至尝试了^(http|https|ftp)\://^(http|https|ftp)\\://

xbp102n0

xbp102n01#

这里需要一个 * 完整的输入 * 匹配。

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

编辑:(基于@davidchambers的评论)

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

pzfprimi2#

除非有令人信服的理由使用正则表达式,否则我只会使用String.startsWith:

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

如果这样也更快我也不会惊讶。

b1zrtrql

b1zrtrql3#

如果你想用不区分大小写的方式来做,这是更好的:

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

pvabu6sv4#

我认为regex / string解析解决方案非常棒,但是对于这个特定的上下文,似乎只使用java的url解析器是有意义的:
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
sq1bmfud

sq1bmfud5#

test.matches()方法检查所有文本。使用test.find()

f4t66c6m

f4t66c6m6#

在startsWith和matches之间添加验证。

import java.net.URL

fun main(args: Array<String>) {
    
    val IMAGE_SERVER = "https://google.com/file/"
    val IMAGE_REG: String by lazy {
        val url = URL(IMAGE_SERVER)
        "^(http|https)://${url.host}${url.path}.*\$"
    }
    
    val regx = Regex(IMAGE_REG)
    println(IMAGE_REG)
    

    var begin = System.nanoTime()
    var aa = IMAGE_SERVER.startsWith(IMAGE_SERVER)
    println("startsWith:"+ (System.nanoTime()-begin))
    println("startsWith:"+ aa)
    
    begin = System.nanoTime()
    aa = IMAGE_SERVER.matches(regx)
    println("matches:"+ (System.nanoTime()-begin))
    println("matches:"+ aa)
    

}

开头为:3755625
开头为:true
匹配次数:174250
匹配:真
匹配时间为174us,启动时间为3.755ms
matches在性能和场景中的代码清洁度方面比startsWith好得多。

相关问题