假设我有以下字符串:
1: /kb/tags/racing?&foo=bar
2: /kb/tags/racing
3: /kb/tags/racing#hash
4: /kb/tags/racing:foo:bar#hash
5: /kb/tags/racing?&foo=bar#hash
匹配:
1: Should match "racing"
2: Should match "racing"
3: Should match "racing"
4: Should match "racing:foo:bar"
5: Should match "racing"
以下是我尝试过的(和失败的(:
/(?<=[kb/tags])[^?|#]*(?=})/
这永远都不起作用。。。但我挖了一下,有什么想法吗?
干杯
使用此:
/kb/tags.*/([^/?#s]+)(?!.*/)
并从捕获组1中检索匹配项。
在演示中,请参阅右侧窗格中的第1组捕获。
示例JavaScript:
var myregex = //kb/tags.*/([^/?#s]+)(?!.*/)/;
var matchArray = myregex.exec(yourString);
if (matchArray != null) {
thematch = matchArray[1];
} else {
thematch = "";
}
解释
/kb/tags
与/kb/tags
匹配.*
匹配任何字符/
匹配正斜杠([^/?#s]+)
周围的括号捕获一个或多个字符,这些字符不是组1括号内的字符- 负前瞻
(?!.*/)
断言后面不是任何字符,而是一个正斜杠,确保我们得到最后一个
参考
- 前瞻性和前瞻性零长度断言
- 掌握向前看和向后看
我想你想要
(str.match(/(?<=kb/tags/)[^?#]*/) || [])[0]
但是JS不支持lookbehinds。然后,您可以尝试一个捕获组:
(str.match(/kb/tags/([^?#]*)/) || [])[1]
假设您的href与示例中的一样,那么这样做怎么样。
Javascript
var hrefs = [
'/kb/tags/racing?&foo=bar',
'/kb/tags/racing',
'/kb/tags/racing#hash',
'/kb/tags/racing:foo:bar#hash',
'/kb/tags/racing?&foo=bar#hash',
'http://example.com/kb/tags/breeding:racing:breeding:all+articles?&sdff=sfff#jsdf'
];
hrefs.forEach(function (href) {
console.log(href.split('#').shift().split('?').shift().split('/kb/tags/').pop());
});
输出
racing
racing
racing
racing:foo:bar
racing
breeding:racing:breeding:all+articles
在jsFiddle 上
.*/K(?:[^?#]|$|n)*
试试这个