有没有办法在一行中编写一个正则表达式,只能捕获这样的url的特定部分? :
ftp://trial.com:50/papers/history.pdf
只获得ftp,trial.com和50。
market://find/tools/new
只获得市场并找到
答案 0 :(得分:1)
试试这个正则表达式:
\/\/|\/.*|(\w+)
解释
# 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。