20

我有一点正则表达式的麻烦。

我正在尝试获取此 url 中的路径videoplay

http://video.google.co.uk:80/videoplay?docid=-7246927612831078230&hl=en#hello

如果我使用这个正则表达式/.+,它也会匹配/video

我需要某种反/否定匹配来不包括//

4

12 回答 12

37

如果您的 JavaScript 网络应用程序需要此功能:我在此主题上找到的最佳答案是此处。代码的基本(也是原始)版本如下所示:

var parser = document.createElement('a');
parser.href = "http://example.com:3000/pathname/?search=test#hash";

parser.protocol; // => "http:"
parser.hostname; // => "example.com"
parser.port;     // => "3000"
parser.pathname; // => "/pathname/"
parser.search;   // => "?search=test"
parser.hash;     // => "#hash"
parser.host;     // => "example.com:3000"

谢谢约翰·朗,你白天造的!

于 2015-07-03T05:22:14.977 回答
13

(http[s]?:\/\/)?([^\/\s]+\/)(.*)第 3 组
演示:http ://regex101.com/r/vK4rV7/1

于 2014-08-19T08:54:01.807 回答
8

此表达式获取 之后的所有内容videoplay,即 url 路径。

/\/(videoplay.+)/

此表达式获取端口之后的所有内容。也包括路径。

/\:\d./(.+)/

但是,如果使用Node.js我推荐使用本机url模块。

var url = require('url')
var youtubeUrl = "http://video.google.co.uk:80/videoplay?docid=-7246927612831078230&hl=en#hello"
url.parse(youtubeUrl)

所有的正则表达式都适合你。

{
  protocol: 'http:',
  slashes: true,
  auth: null,
  host: 'video.google.co.uk:80',
  port: '80',
  hostname: 'video.google.co.uk',
  hash: '#hello',
  search: '?docid=-7246927612831078230&hl=en',
  query: 'docid=-7246927612831078230&hl=en',
  pathname: '/videoplay',
  path: '/videoplay?docid=-7246927612831078230&hl=en',
  href: 'http://video.google.co.uk:80/videoplay?docid=-7246927612831078230&hl=en#hello' 
}
于 2015-08-25T11:06:21.173 回答
3

你可以试试这个:

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

([^?]+)上面是返回路径的捕获​​组。

请注意,这不是一个全 URL 正则表达式。它只是解决了匹配“//”之后出现的第一个“/”和后面的“?”之间的所有文本的问题。特点。

如果您需要一个全匹配的正则表达式,您可以查看这个StackOverflow 链接,他们在其中讨论并剖析了 URI 的所有可能性,并将其分解为包括您的“路径”在内的组成部分。
如果您认为这是一种矫枉过正,并且如果您知道您的输入 URL 将始终遵循您的路径在第一个“/”和后面的“?”之间的模式,那么上面的正则表达式就足够了。

于 2012-08-19T03:08:39.827 回答
3

function getPath(url, defaults){
    var reUrlPath = /(?:\w+:)?\/\/[^\/]+([^?#]+)/;
    var urlParts = url.match(reUrlPath) || [url, defaults];
    return urlParts.pop();
}
alert( getPath('http://stackoverflow.com/q/123/regex-url', 'unknown') );
alert( getPath('https://stackoverflow.com/q/123/regex-url', 'unknown') );
alert( getPath('//stackoverflow.com/q/123/regex-url', 'unknown') );
alert( getPath('http://stackoverflow.com/q/123/regex-url?foo', 'unknown') );
alert( getPath('http://stackoverflow.com/q/123/regex-url#foo', 'unknown') );
alert( getPath('http://stackoverflow.com/q/123/regex-url/', 'unknown') );
alert( getPath('http://stackoverflow.com/q/123/regex-url/?foo', 'unknown') );
alert( getPath('http://stackoverflow.com/q/123/regex-url/#foo', 'unknown') );
alert( getPath('http://stackoverflow.com/', 'unknown') );

于 2015-06-04T01:56:10.383 回答
1

你的意思是消极的回顾?(?<!/)

于 2012-08-19T01:06:04.380 回答
1

对于新的 Google 员工,请在任何环境中使用 JavaScript Web api URL:

new URL('your url string').pathname

https://developer.mozilla.org/en-US/docs/Web/API/URL/URL

于 2021-08-11T09:06:31.760 回答
1

var subject =
'<link rel="shortcut icon" href="https://cdn.sstatic.net/Sites/stackoverflow/img/favicon.ico?v=ec617d715196"><link rel="apple-touch-icon" href="https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon.png?v=c78bd457575a"><link rel="image_src" href="https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon.png?v=c78bd457575a">';
var re=/\"[a-z]+:\/\/[^ ]+"/m;
document.write(subject.match(re));

你可以试试这个

/\"[a-z]+:\/\/[^ ]+/

用法

if (/\"[a-z]+:\/\/[^ ]+/m.test(subject)) {  // Successful match } else {    // Match attempt failed }
于 2020-05-05T13:16:56.507 回答
0

它不是正则表达式解决方案,但大多数语言都有一个 URL 库,可以将任何 URL 解析为其组成部分。对于您正在做的事情,这可能是一个更好的解决方案。

于 2012-08-19T18:33:52.537 回答
0

请试试这个:

^http[s]?:\/\/(www\.)?(.*)?\/?(.)*
于 2021-11-10T07:33:50.247 回答
0

即使使用语言功能的答案很好,这里还有另一种使用 REGEXP 将 URL 拆分为组件的方法:

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?
     ||            |  |          |       |   |        | |
     12 - scheme   |  |          |       |   |        | |
                   3  4 - authority, includes hostname/ip and port number.
                                 5 - path|   |        | |
                                         6   7 - query| |
                                                      8 9 - fragment
于 2021-11-10T08:01:19.343 回答
-1

我想这就是你所追求的:[^/]+$

演示:http ://regex101.com/r/rG8gB9

于 2012-08-19T11:29:57.167 回答