来自http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html:
\Z The end of the input but for the final terminator, if any
\z The end of the input
Run Code Online (Sandbox Code Playgroud)
但这在实践中意味着什么?当我使用\ Z或\ z时,你能举个例子吗?
在我的测试中,我认为这"StackOverflow\n".matches("StackOverflow\\z")
将返回true并"StackOverflow\n".matches("StackOverflow\\Z")
返回false.但实际上两者都是假的.哪里出错了?
Jak*_*use 34
即使
\Z
并且$
仅在字符串的末尾匹配(当插入符号断点处的插入符号和美元匹配的选项关闭时),也有一个例外.如果字符串以一个换行符结尾,则\Z
和$
将匹配在该行中断前的位置,而不是在字符串的最末尾.这种"增强"是由Perl引入的,并被许多正则表达式复制,包括Java,.NET和PCRE.在Perl中,当从文件中读取一行时,结果字符串将以换行符结束.从文件"joe"的文件中读取一行会产生字符串joe \n.当应用于此字符串,都
^[a-z]+$
和\A[a-z]+\Z
将匹配"乔".如果您只想在字符串的绝对末端匹配,请使用
\z
(小写z而不是大写Z).\A[a-z]+\z
与joe \n不匹配.\z
换行符后的匹配,与字符类不匹配.
http://www.regular-expressions.info/anchors.html
我读这个的方式"StackOverflow\n".matches("StackOverflow\\z")
应该返回false,因为你的模式不包括换行符.
"StackOverflow\n".matches("StackOverflow\\z\\n") => false
"StackOverflow\n".matches("StackOverflow\\Z\\n") => true
Run Code Online (Sandbox Code Playgroud)
刚检查一下.它看起来像调用Matcher.matches()时(就像在代码中,在幕后),\ Z的行为类似于\ z.但是,当调用Matcher.find()时,它们的行为与预期的不同.以下返回true:
Pattern p = Pattern.compile("StackOverflow\\Z");
Matcher m = p.matcher("StackOverflow\n");
System.out.println(m.find());
Run Code Online (Sandbox Code Playgroud)
如果用\ z替换\ Z,则返回false.
我发现这有点令人惊讶......