正则表达式exctact url substring

时间:2016-01-22 18:08:28

标签: regex

有没有办法在一行中编写一个正则表达式,只能捕获这样的url的特定部分? :

ftp://trial.com:50/papers/history.pdf

只获得ftp,trial.com和50。

market://find/tools/new

只获得市场并找到

3 个答案:

答案 0 :(得分:1)

试试这个正则表达式:

\/\/|\/.*|(\w+)

Regex live here.

解释

            # match without grouping what you do not want
\/\/        # two slashes
|           # OR
\/.*        # everything after the first alone-slash
|           # OR
            # now match grouping what you want
(\w+)       # each desired word in group 1

希望有所帮助

答案 1 :(得分:0)

我认为问题是如何提取匹配字符串的一部分,而不是如何匹配整个字符串。为此,某些工具允许使用括号标记(必须转义)。请考虑使用sed

的此示例
 echo ftp://trial.com/hist.pdf | sed 's/^\(.\+\):\/\/\([^\/]\+\)\/\?.*$/\1 \2/'

sed命令是s / regexp / 替换 /所以它匹配 regexp 并用替换它替换。这标记括号内的.\+部分,该部分使用\1打印在输出中。第二个括号之间的部分是//之后和下一个/之前的部分。在替换中使用\2打印。使用\+表示非零序列(至少一个)而不是*,其为零或更多。必须转义括号以标记用于替换的子串,否则它们只是表示括号字符。

^表示该行的开头。 .\+至少是某个角色的一个角色。 :\/\/与://匹配。第二个括号之间的[^\/]\+是至少一个不是/后跟\/\?的字符(可选的/)。最后,.*$是直到行尾的所有内容。

答案 2 :(得分:0)

(\w+):\/\/([\w\.]+)(:(\d+))?.*

或限制较少的版本(小心):

(.+?):\/\/([^:\/\?]+)(:(\d+))?.*

小组:

$1是协议
$2是域名 $4是端口(可选)

示例和解释here