只匹配最后一个出现的内容,当有多个相同内容时。

3

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

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

但是,我得到的答案是 20170401。如何更改 match 来仅匹配最后一次出现的 8 个数字?


1
.match(/(\d{8})\.htm/)[1] - Tushar
如果您的字符串包含换行符,则 /\d{8}(?!.*\d+)/ 可能会返回意外结果。 - Wiktor Stribiżew
3个回答

5
使用全局标志(g),并获取最后一个:
var matches = "http://www.website.com/20170401_63582484.htm".match(/\d{8}/g);
matches[matches.length - 1]  // => "63582484"

@falsetrue 这个解决方案更好。有时候另一个解决方案找不到任何匹配项。 - user1665355
请注意,这个正则表达式只匹配8个连续数字而不检查任何边界。这意味着,使用此解决方案,您将从some words 1234567890 0987654321中获得09876543,而使用此正则表达式您将获得最后8位数字87654321 - Wiktor Stribiżew
@WiktorStribiżew,我认为使用单词边界更容易使用:\d{8}\b - falsetru
但是你仍然需要获取它们所有。 - Wiktor Stribiżew

2

您可以使用负向先行断言

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

正则表达式解释

Regular expression visualization

更新:

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


@Pravan C Balan 好的,那么我总是得到最后一次出现的吗? - user1665355
这个回答并没有解决原问题,也就是说它不会总是返回字符串中的最后八位数字。 - Wiktor Stribiżew
当然: var s = "Line 12345678 - 87654321 end\nLine 2: 09876543 : 26543897 end of string";。我的回答展示了如何使用最短的模式正确执行该操作。 - Wiktor Stribiżew
1
@WiktorStribiżew:好的,我认为他不需要从那么复杂的字符串中获取...即使您的解决方案在8位数字后面有一个数字时会失败,例如:abc 12345678 fdfd 5....在这种情况下,它将无法匹配任何内容。 - Pranav C Balan
1
你也可以使用贪婪匹配,并在其后加上8个连续数字:"http://www.website.com/20170401_63582484.htm".match(/.*(\d{8})/)[1] - robertklep
1
我已经更新了我的答案,提供了两种解决方案,可以匹配任何不跟随其他八位数字序列的最后八位数字。 - Wiktor Stribiżew

1
为了匹配可能包含换行符的整个字符串中的最后8个数字,请使用:
/\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];
}

我认为这取决于输入,哪种解决方案更好。如果输入始终包含“.htm”,我会更喜欢正向先行断言,否则就使用你的方法。 - bobble bubble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接