我正在尝试编写一个正则表达式,它将从URL捕获域和路径.我试过了:
https?:\/\/(.+)(\/.*)
Run Code Online (Sandbox Code Playgroud)
Match 1
0. google.com
1. /foo
Run Code Online (Sandbox Code Playgroud)
但不是我对http://example.com/foo/bar的期望:
预期:
Match 1
0. google.com
1. /foo/bar
Run Code Online (Sandbox Code Playgroud)
实际:
Match 1
0. google.com/foo
1. /bar
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
https?:\/\/(.+)(\/.*)...
我究竟做错了什么?
+很贪心.你应该使用它[^/]而不是点.
另请注意,您的"路径"部分还将包含查询字符串和片段(哈希).
这个只获取域(+登录,密码,端口)和路径(没有查询字符串或片段).
^https?://([^/]+)(/[^?#]*)?
Run Code Online (Sandbox Code Playgroud)
我会相应地避开你的斜线.
警告:这需要一个有效的URI,因此它很好,并解析权限和路径部分.如果要根据标准解析URI,则需要实现整个语法或从RFC 2396的 §8获取官方正则表达式.
以下行是用于将URI引用分解为其组件的正则表达式.
Run Code Online (Sandbox Code Playgroud)^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 12 3 4 5 6 7 8 9上面第二行中的数字只是为了提高可读性; 它们表示每个子表达的参考点(即每个配对括号).我们将子表达式匹配的值称为$.例如,将上面的表达式与之匹配
Run Code Online (Sandbox Code Playgroud)http://www.ics.uci.edu/pub/ietf/uri/#Related导致以下子表达式匹配:
Run Code Online (Sandbox Code Playgroud)$1 = http: $2 = http $3 = //www.ics.uci.edu $4 = www.ics.uci.edu $5 = /pub/ietf/uri/ $6 = <undefined> $7 = <undefined> $8 = #Related $9 = Relatedwhere表示该组件不存在,如上例中的查询组件的情况.因此,我们可以确定四个组件的值和片段为
Run Code Online (Sandbox Code Playgroud)scheme = $2 authority = $4 path = $5 query = $7 fragment = $9