Java正则表达式-检查字符串是否以特定数量的数字结尾

3
Java的matches方法对于以下所有情况都返回'true':
// check if a string ends with an exact number of digits (yyyyMMdd 8 digits)

    String s20180122_1 = "fileNamePrefix_20171219";
    String s20180122_2 = "fileNamePrefix_20171219131415111";

    System.out.println(s20180122_1.matches(".*\\d{8}$"));
    System.out.println(s20180122_2.matches(".*\\d{8}$"));
    System.out.println(s20180122_2.matches(".*\\d{8,8}$"));

因为s20180122_2有更多的数字,我期望第二个和第三个检查返回“false”,但它们没有。我该如何强制进行完全匹配(仅限8位数字,不多也不少)?

感谢您的帮助。

2个回答

3
这应该可以运行:
.*[^\d]\d{8}$

如果Java正则表达式引擎支持\D组,您可以使用它来替代[^\d]


1
非常有趣。它有效。你能解释一下逻辑吗? - badbee
@badbee,你的正则表达式的主要问题是它没有设置数字部分的左边界,而在你的例子中是“_”。从你的例子中,你可以使用这个正则表达式:.*_\d{8}$。为了使它更通用一些,你可以使用[^\d](任何不是数字的字符)代替“_”字符。 - Kirill Polishchuk
感谢您的解释。 - badbee
这个正则表达式在Oracle上没有按预期工作。它返回了9位数字的true。我还在努力解决这个问题。实际上,我想测试以6或8位数字结尾的情况。 - slestak
搞定了。无法编辑我的先前评论。.*[:digit:{6|8}]$ - slestak

1

这个正则表达式 会验证最后8个字符是否为yyyyMMdd格式的数字(年份在20世纪和21世纪之间):

.*[^\d](19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])$

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