我有一个字符串:
"http://www.website.com/20170401_63582484.htm"
然后我尝试匹配63582484:
"http://www.website.com/20170401_63582484.htm".match(/\d{8}/)
然后我得到答案20170401
。
如何将match
更改为仅匹配8位数的最后一次出现?
答案 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 强>
更新:
如果字符串始终采用特定格式(后面跟.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];
}