我有一个字符串:"http://www.website.com/20170401_63582484.htm"
然后,我尝试匹配 63582484
:"http://www.website.com/20170401_63582484.htm".match(/\d{8}/)
但是,我得到的答案是 20170401
。如何更改 match
来仅匹配最后一次出现的 8 个数字?
我有一个字符串:"http://www.website.com/20170401_63582484.htm"
然后,我尝试匹配 63582484
:"http://www.website.com/20170401_63582484.htm".match(/\d{8}/)
但是,我得到的答案是 20170401
。如何更改 match
来仅匹配最后一次出现的 8 个数字?
g
),并获取最后一个:var matches = "http://www.website.com/20170401_63582484.htm".match(/\d{8}/g);
matches[matches.length - 1] // => "63582484"
您可以使用负向先行断言
console.log("http://www.website.com/20170401_63582484.htm".match(/\d{8}(?!.*\d{8})/)[0]);
更新:
如果字符串始终以特定格式(即后跟.htm
)出现,则可以使用正则表达式\d{8})\.htm/
,如@Tushar所建议。
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]);
var s = "Line 12345678 - 87654321 end\nLine 2: 09876543 : 26543897 end of string";
。我的回答展示了如何使用最短的模式正确执行该操作。 - Wiktor Stribiżewabc 12345678 fdfd 5
....在这种情况下,它将无法匹配任何内容。 - Pranav C Balan"http://www.website.com/20170401_63582484.htm".match(/.*(\d{8})/)[1]
。 - robertklep/\d{8}(?=(?:(?!\d{8})[\s\S])*$)/
(?!\d{8})(?:\D*\d){8}\D*$
是正向先行断言,要求字符串在结尾之前没有其他八位数字块。[\s\S]
模式匹配包括换行符在内的任何字符,并且负向先行断言(?!\d{8})
对这个通用字符类进行了限制。
备选方案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];
}
.match(/(\d{8})\.htm/)[1]
- Tushar/\d{8}(?!.*\d+)/
可能会返回意外结果。 - Wiktor Stribiżew