仅在几个时匹配最后一次出现

时间:2016-02-20 09:35:14

标签: javascript regex match

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

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

然后我得到答案20170401。 如何将match更改为仅匹配8位数的最后一次出现?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

您可以使用 negative look ahead assertion

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

<强> Regex explanation

Regular expression visualization

更新:

如果字符串始终采用特定格式(后面跟.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]);

答案 2 :(得分:1)

要匹配可能包含换行符号的整个字符串中的最后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];
}