1

通过编译以下内容:

 System.out.println(Pattern.matches(".?(\\d)$","3"));

它返回 true,因为在3没有任何内容之前并?检查一或零。但是 3 已经是输入的第一个字符,它从 0 开始并以 1 结束。jvm 如何识别 3 之前没有任何内容。例如以下。

System.out.println(Pattern.matches(".*","hello");

它也返回 true,但只有最后一个字符与“nothing”匹配。字符串的开头不应该有“无”字符,只有结尾才对吗?

4

3 回答 3

2
  1. 这实际上与 JVM 无关。这是关于 Java 正则表达式的。
  2. 正则表达式“.*”表示“匹配 0 个或多个字符”。很容易满足这一点,因为空白字符串有 0 个字符,因此满足这一点。Java 正则表达式是选择惰性匹配空字符串,还是贪婪匹配整个字符串,取决于 Java 正则表达式的实现。如果您阅读了这篇出色的文章(http://docs.oracle.com/javase/tutorial/essential/regex/quant.html,您会发现 Java 中的“.*”等模式被认为是“不情愿的”量词,并且会更喜欢尽量少取
  3. 根据该文章中的信息,您可以看到像“.{0,}”这样的模式是同一表达式的贪婪版本。如果这对您来说确实是个问题,也许您想改用它。
于 2013-07-11T14:20:22.310 回答
1

您没有正确解释您的正则表达式。没有所谓的“虚无字符”。相反,您的模式是:任何字符后跟字符串末尾的数字字符串末尾的数字。

当然,“3”非常适合第二个描述。

于 2013-07-11T14:19:11.187 回答
0

matches方法尝试完全匹配输入。

所以没有必要使用^, $..

于 2013-07-11T14:18:39.953 回答