1

我想知道是否有办法做到这一点

var string = "foo::bar"

获取字符串的最后一部分:"bar"仅使用正则表达式。

我试图做前瞻,但无法掌握它们来做到这一点。

--

更新

也许一些例子会使问题更清楚。

var st1 = "foo::bar::0"
match should be 0

var st2 = "foo::bar::0-3aab"
match should be 0-3aab

var st3 = "foo"
no match should be found
4

4 回答 4

8

您可以使用负前瞻:

/::(?!.*::)(.*)$/

结果将在捕获中。

另一种方法:

/^.*::(.*)$/

这应该有效,因为.*贪婪地匹配,所以::将匹配该字符串的最后一次出现。

于 2010-12-14T20:31:29.417 回答
3

简单地,

/::(.+)$/

除非您确切知道要匹配多长的字符串,否则不能使用前瞻。幸运的是,这不是问题,因为您只查看字符串的结尾$

于 2010-12-14T20:32:44.817 回答
1

我不会为此使用正则表达式(尽管您当然可以);我会在 上拆分字符串::,因为这在概念上是您想要做的。

function lastToken(str) {
  var xs = str.split('::');
  return xs.length > 1 ? xs.pop() : null;
}

如果你真的只想要一个正则表达式,你可以使用/::((?:[^:]|:(?!:))*)$/. 首先,它匹配一个文字::。然后,我们使用括号将所需的东西放入捕获组 1。所需的东西是一个或多个带括号的(?:...)字符串的副本;这个包围组没有捕获。然后我们查找[^:]非冒号字符或:(?!:)冒号后跟非冒号。这是一个否定的前瞻,仅当下一个标记与包含的模式(?!...)匹配时才匹配。由于 JavaScript 不支持负面的lookbehinds,我看不到避免捕获的好方法,但是您可以将其包装在一个函数中:::

function lastTokenRegex(str) {
  var m = str.match(/::((?:[^:]|:(?!:))*)$/);
  return m && m[1];
}
于 2010-12-14T21:04:08.070 回答
0
var string2 = string.replace(/.*::/, "");

虽然也许string不是您的字符串的最佳名称选择?

于 2010-12-14T20:34:01.933 回答