【问题标题】:Regex to find last token on a string正则表达式查找字符串上的最后一个标记
【发布时间】:2023-03-06 18:41:01
【问题描述】:

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

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

【问题讨论】:

  • 作为分隔符,我希望在最后一个 '::' 部分之后拥有所有内容,可能是在 '::' 之后我有任何其他类型的符号、数字等。
  • 最后一个token可以包含:吗?如果是,可以是foo:::bar,你会如何处理?

标签: javascript regex lookahead


【解决方案1】:

您可以使用否定前瞻:

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

然后结果将在捕获中。

另一种方法:

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

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

【讨论】:

  • 如果您有尾随空格,或者可能有尾随空格,也可能没有尾随空格,请尝试使用 `"\\w+\\s*$" 代替。
  • 这不适用于我的示例,因为它将匹配第一个示例中的“bar::0”。
  • 这行不通——* 是贪婪的,例如,在foo::bar::0-3aab 中匹配bar::0-3aab
  • @Antal S-Z:你是对的,它不适用于更新的示例,但你给出的为什么它不起作用的原因是不正确的。这与贪婪无关。使用惰性匹配 .*? 也会失败。我已经用一个有希望的工作版本更新了我的答案。
  • @Antal S-Z:提到贪婪让我想到了替代方法,非常感谢。 :)
【解决方案2】:

简单地说,

/::(.+)$/

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

【讨论】:

  • 这不适用于我的示例,因为它将匹配第一个示例中的“bar::0”。
  • 这行不通——+ 是贪婪的,例如,在foo::bar::0-3aab 中匹配bar::0-3aab
【解决方案3】:

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

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

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

function lastTokenRegex(str) {
  var m = str.match(/::((?:[^:]|:(?!:))*)$/);
  return m && m[1];
}

【讨论】:

    【解决方案4】:
    var string2 = string.replace(/.*::/, "");
    

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

    【讨论】:

      猜你喜欢
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      相关资源
      最近更新 更多