1

我目前在使用正则表达式提取 URL 时遇到一些问题。

我希望我的正则表达式采用 URL,例如:

http://stackoverflow.com/questions/ask
https://stackoverflow.com
http://local:1000
https://local:1000

通过一些教程,我了解到这个正则表达式可以找到以上所有内容:^(http|https)\://.*$但是,当它根本不应该使用它时,它也会http://local:1000;http://invalid http://khttp://作为单个字符串使用。

我知道我的表达式不是为了排除这种情况而写的,但我的问题是我想不出如何写它,所以它会检查这种情况。

任何帮助是极大的赞赏!

编辑:

看看我的问题,我似乎可以消除我的问题,只要我可以实施检查以确保在初始 http:// 或 https:// 之后的字符串中不会出现“//”,任何想法关于如何实施?

抱歉,这将使用 Java 完成

我还需要添加以下约束:一个字符串,例如http://local:80/test:90因为端口重复而失败......我需要一个只允许两个总数的约束:一个有效字符串中的符号(一个在 http/s 之后)和一个港口前。

4

3 回答 3

1

检查您的编程语言,看看它是否已经有解析器。例如 php 有 parse_url()

于 2013-01-28T19:22:15.740 回答
1

如果://在字符串中第一次出现之后没有,这只会产生匹配。

^https?:\/\/(?!.*:\/\/)\S+

请注意,尝试从字符串中解析有效的 url 非常复杂,请参阅
In search of the perfect URL validation regex,因此上述内容不会尝试这样做。
它只会匹配协议并遵循非空格字符。

在 Java 中

Pattern reg = Pattern.compile("^https?:\\/\\/(?!.*:\\/\\/)\\S+");
Matcher m = reg.matcher("http://somesite.com"); 
if (m.find()) {
    System.out.println(m.group());
} else {
    System.out.println("No match");
}
于 2013-01-28T19:25:22.523 回答
0

来自http://net.tutsplus.com/tutorials/other/8-regular-expressions-you-should-know/

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/

这可能会根据编程语言/工具而改变

于 2013-01-28T19:27:36.357 回答