Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Regex查找字符串上的最后一个标记_Javascript_Regex_Lookahead - Fatal编程技术网

Javascript Regex查找字符串上的最后一个标记

Javascript Regex查找字符串上的最后一个标记,javascript,regex,lookahead,Javascript,Regex,Lookahead,我想知道有没有办法做到这一点 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 fo

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

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

您可以使用负前瞻:

/::(?!.*::)(.*)$/
结果将出现在捕获中

另一种方法:

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

这应该是可行的,因为。*非常匹配,所以::将匹配该字符串的最后一次出现。

您可以使用负前瞻:

/::(?!.*::)(.*)$/
结果将出现在捕获中

另一种方法:

/^.*::(.*)$/
这应该是可行的,因为。*非常匹配,所以::将匹配该字符串的最后一次出现

/::(.+)$/
除非您确切知道要匹配的字符串的长度,否则不能使用lookaheads。幸运的是,这不是一个问题,因为您只查看字符串$的结尾。

简单地说

/::(.+)$/
除非您确切知道要匹配的字符串的长度,否则不能使用lookaheads。幸运的是,这不是问题,因为您只看到字符串$的末尾

虽然字符串可能不是字符串的最佳名称选择


虽然字符串可能不是字符串的最佳名称选择?

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

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];
}

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

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];
}

如果您有尾随空格,或者可能有尾随空格,也可能没有尾随空格,请尝试使用“\\w+\\s*$。这对我的示例不起作用,因为它将匹配第一个示例中的bar::0。这不起作用-*是贪婪的,例如,在foo::bar::0-3aab中匹配bar::0-3aab。@Antal S-Z:您认为它对更新的示例不起作用是正确的,但您给出的不起作用的原因是不正确的。这和贪婪无关。使用惰性匹配。*?也会失败。我已经用一个有希望的工作版本更新了我的答案。@Antal S-Z:提到贪婪给了我另一种方法的想法,所以谢谢你如果您有尾随空格,或者可能有尾随空格,也可能没有尾随空格,请尝试使用“\\w+\\s*$。这对我的示例不起作用,因为它将匹配第一个示例中的bar::0。这不起作用-*是贪婪的,例如,在foo::bar::0-3aab中匹配bar::0-3aab。@Antal S-Z:您认为它对更新的示例不起作用是正确的,但您给出的不起作用的原因是不正确的。这和贪婪无关。使用惰性匹配。*?也会失败。我已经用一个有希望的工作版本更新了我的答案。@Antal S-Z:提到贪婪给了我另一种方法的想法,所以谢谢你作为分隔符,我希望在最后一个“::”部分之后包含所有内容,可以是在“::”之后,我有任何其他类型的符号、数字等。最后一个标记可以包含:?如果是这样,它可能是foo:::bar,您将如何处理它?作为分隔符,我希望所有内容都位于最后一个“::”部分之后,可能是在“::”之后。我有任何其他类型的符号、数字等。最后一个标记是否可以包含:?如果是这样,它会是foo:::bar吗?您将如何处理它?这对我的示例不起作用,在第一个示例中它将匹配bar::0。这不起作用-+是贪婪的,例如,在foo::bar::0-3aab中匹配bar::0-3aab。这对我的示例不起作用,在第一个示例中它将匹配bar::0。这不会起作用 work-+是贪婪的,例如,在foo::bar::0-3aab中匹配bar::0-3aab。