【问题标题】:Match last occurency only when several仅当多个时匹配最后一次出现
【发布时间】:2016-06-01 23:27:55
【问题描述】:

我有一个字符串: "http://www.website.com/20170401_63582484.htm"

然后我尝试匹配 63582484: "http://www.website.com/20170401_63582484.htm".match(/\d{8}/)

但后来我得到了答案20170401。 如何将match 更改为仅匹配最后出现的 8 位数字?

【问题讨论】:

  • .match(/(\d{8})\.htm/)[1]
  • 如果您的字符串包含换行符,/\d{8}(?!.*\d+)/ 可能会返回意外结果。

标签: javascript regex match


【解决方案1】:

使用全局标志(g),获取最后一个:

var matches = "http://www.website.com/20170401_63582484.htm".match(/\d{8}/g);
matches[matches.length - 1]  // => "63582484"

【讨论】:

  • @falsetrue 这个解决方案效果更好。有时另一个没有发现任何事件。
  • @user1665355:请注意,这个只匹配 8 个连续的数字而不检查任何边界。这意味着,您将使用this solutionsome words 1234567890 0987654321 获得09876543,而您将使用this regex 获得87654321 的最后8 位数字。
  • @WiktorStribiżew,我认为使用单词边界更容易使用:\d{8}\b
  • 但你还是得把它们全部弄下来。
【解决方案2】:

您可以使用negative look ahead assertion

console.log("http://www.website.com/20170401_63582484.htm".match(/\d{8}(?!.*\d{8})/)[0]);

Regex explanation

更新:

如果字符串始终采用特定格式(后跟.htm),那么您可以按照@Tushar 的建议使用正则表达式\d{8})\.htm/

console.log("http://www.website.com/20170401_63582484.htm".match(/(\d{8})\.htm/)[1]);

或者你可以通过正向向前看来使用相同的,在这种情况下不需要捕获组

console.log("http://www.website.com/20170401_63582484.htm".match(/\d{8}(?=\.htm)/)[0]);

【讨论】:

  • @Pravan C Balan 好的,那我总是最后一次出现?
  • 这个答案没有解决原始问题,即它不会总是返回字符串中的最后八位数字。
  • @WiktorStribiżew:好的,我认为他不需要从那么复杂的字符串中获取....即使如果 8 位之后的数字您的解决方案将失败,例如:@987654330 @....,在这种情况下它不会匹配任何东西
  • 你也可以做一个贪心全匹配,后跟8个连续数字:"http://www.website.com/20170401_63582484.htm".match(/.*(\d{8})/)[1]
  • 我已经用两种解决方案更新了我的答案,这些解决方案与任何其他八位数字序列后不跟随的任何最后八位数字匹配。
【解决方案3】:

要匹配整个字符串中可能包含换行符的最后 8 位数字,请使用

/\d{8}(?=(?:(?!\d{8})[\s\S])*$)/

(?=(?:(?!\d{8})[\s\S])*$) 是正向前瞻,它要求字符串在字符串结尾之前没有其他八位数字块。 [\s\S] 模式匹配任何字符,包括换行符和封闭的否定前瞻 (?!\d{8}) tempers 这个通用字符类。

备选方案 1:使用负前瞻可以实现相同的结果:

/\d{8}(?![\s\S]*\d{8}[\s\S]*$)/

替代方案 2:要匹配字符串中的最后 8 个连续数字后面没有其他数字,您可以使用带有 (?=\D*$) 正向前瞻的正则表达式:

/\d{8}(?=\D*$)/

前瞻要求八位数字后面必须跟零个或多个非数字字符,直到字符串的末尾。

像这样使用它

var m = str.match(/\d{8}(?=\D*$)/);
if (m) { 
    document.body.innerHTML = m[0];
}

【讨论】:

  • 我认为这取决于输入,首选哪种解决方案。如果输入总是包含.htm,我更喜欢积极的前瞻,否则你的。
猜你喜欢
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多