2011-10-07 59 views
12

我想测试一个字符串是否以数字结尾。我期望以下Java行可以打印出真实的。为什么它打印错误?正则表达式来测试一个字符串是否以数字结尾

System.out.println("I end with a number 4".matches("\\d$")); 
+0

这也可能与你的问题:http://stackoverflow.com/questions/627545/java-regexp-problem-www-vs-www – AdrianoKF

回答

8

在Java正则表达式,有(找到一个匹配的字符串的任何地方)和Matcher.matches()Matcher.find()之间的差异(符合整个字符串)。

字符串只有一个matches()方法(实施相当于此代码:Pattern.compile(pattern).matcher(this).matches();),所以你需要创建一个完整的字符串相匹配的模式:

System.out.println("I end with a number 4".matches("^.*\\d$")); 
+0

其实,更简单: System.out.println(“我以数字4结尾”.matches(“。* \\ d”)); 但'$'应该表示我不必在开头指定。*。 为什么最后没有'$'? – Thor

+0

额外的退格删除了退出行为。因此“^。* \\ d $”可能不起作用。你可以在这样的在线正则表达式测试中测试:http://www.regexplanet.com/simple/index.html – Kash

+0

@Kash在Java中,额外的退格是必要的 –

15

你的正则表达式不会匹配整个字符串,但只最后一部分。尝试下面的代码,它应该很好地工作,因为它匹配整个字符串。 http://www.regexplanet.com/simple/index.html

System.out.println("I end with a number 4".matches("^.+?\\d$")); 

您可以在线正则表达式测试仪进行快速检查像这样进行测试。这也给你你应该在Java代码中使用适当的转义结果。

。+将确保数字之前至少有一个字符。 The 将确保它做一个懒惰的匹配,而不是一个贪婪的匹配。

+0

在这种情况下做一个懒惰的匹配是没有意义的。我们*希望*。+'立即吞噬整个字符串。然后它将退回一个位置,将最后一个字符与'\ d'进行比较,这是我们唯一关心的事情。 –

-1

试试这个:

System.out.println("I end with a number 4".matches(".*\\d\$")); 
+0

不会编译,'\ $'在Java中是非法的 –

1
System.out.println("I end with a number 4".matches(".*\\d")); // prints true 

String s = "I end with a number 4"; 
System.out.println(Character.isDigit(s.charAt(s.length()-1))); // prints true 
2

您的正则表达式是slightly off。试试这个:

System.out.println("I end with a number 4".matches("^.*\\d$")); 

你也可以简单地测试这样的,如果你正在评估在一个时间线:

System.out.println("I end with a number 4".matches(".*\\d")); 

你的原始表达式,而不*只测试看串是否是一个数字并没有考虑可能在该数字之前的文本。这就是为什么它总是假的。

以下不计算为真:

System.out.println("4".matches("^\\d$")); 
相关问题