选择某些字符正则表达式之间的文本

时间:2014-07-17 01:14:33

标签: javascript regex string

假设我有以下字符串:

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"

这是我尝试过的(& failed):

/(?<=[kb\/tags])[^\?|\#]*(?=})/

这无论如何都行不通......但我有一个挖掘,有任何想法吗?

干杯

4 个答案:

答案 0 :(得分:1)

使用此:

\/kb\/tags.*/([^/?#\s]+)(?!.*\/)

从捕获组1中检索匹配。

在演示中,请参阅右侧窗格中的Group 1 captures

示例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组
  • 否定前瞻(?!.*/)断言接下来的不是任何一个正斜线,确保我们得到最后一个。

<强>参考

答案 1 :(得分:1)

我猜你想要

(str.match(/(?<=kb\/tags\/)[^?#]*/) || [])[0]
但是JS并不支持外观。然后,您可以尝试捕获组:

(str.match(/kb\/tags\/([^?#]*)/) || [])[1]

答案 2 :(得分:1)

这样的事情怎么样,假设你的hrefs会像你的例子中那样。

的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

答案 3 :(得分:0)

.*\/\K(?:[^?#]|$|\n)*

试试这个