选择某些字符之间的文本regex



假设我有以下字符串:

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)*

试试这个

最新更新