我有正则表达式的麻烦一点点。
我试图让这个URL路径videoplay
。
http://video.google.co.uk:80/videoplay?docid=-7246927612831078230&hl=en#hello
如果我用这个正则表达式/.+
它匹配/video
也是如此。
我需要某种形式的反/负匹配的为不包括//
我有正则表达式的麻烦一点点。
我试图让这个URL路径videoplay
。
http://video.google.co.uk:80/videoplay?docid=-7246927612831078230&hl=en#hello
如果我用这个正则表达式/.+
它匹配/video
也是如此。
我需要某种形式的反/负匹配的为不包括//
在情况下,如果你需要这个你的JavaScript web应用程序:我对这个话题迄今发现的最好的答案是在这里 。 该代码的基本(也是原)版本是这样的:
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"
谢谢约翰龙,你一天做!
(http[s]?:\/\/)?([^\/\s]+\/)(.*)
组3
演示: http://regex101.com/r/vK4rV7/1
这种表达后得到的一切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'
}
你可以试试这个:
^(?:[^/]*(?:/(?:/[^/]*/?)?)?([^?]+)(?:\??.+)?)$
上述([^] +)是返回路径中捕获组。
请注意,这不是一个全URL正则表达式。 它只是解决您的“//”之后的第一个“/”发生与下列之间的匹配所有的文字问题“?” 字符。
如果你需要一个全匹配的正则表达式,你可以检查这个StackOverflow的链接 ,他们已经讨论和分析的URI的所有可能成其组成部分,包括你的“路径”。
如果您认为矫枉过正,如果你知道你输入的网址将始终遵循具有第一之间的路径“/”和下面的“?”的模式,那么上述正则表达式应该是足够的。
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') );
你的意思是负回顾后? (?<!/)
它不是一个正则表达式的解决方案,但大多数语言都有一个URL库,将解析任何URL成其组成部分。 这可能是你在做什么更好的解决方案。
我觉得这是你以后在做什么: [^/]+$
演示: http://regex101.com/r/rG8gB9