“\ n”是一个垂直的空格,即“\ v”应该匹配吗?

从逻辑上讲,它是(但无论何时角色编码或区域设置正在运行,逻辑都无关紧要)。 根据

perl -e 'print "\n" =~ /\v/ ? "y\n" : "n\n";' 

打印“y”,它是。 根据

 Pattern.compile("\\v").matcher("\n").matches(); 

在java中返回false ,它不是。 如果没有这个post声称,这根本不会让我感到困惑

Sun为JDK7更新的Pattern类有一个奇妙的新标志UNICODE_CHARACTER_CLASS,它使一切正常工作。

但是我使用的是java版本“1.7.0_07”并且该标志存在并且似乎根本没有改变。 而且,“\ n”不是Unicode的新手,而是一个普通的旧ASCII字符,所以我真的不知道这种差异是如何发生的。 可能我做了一些愚蠢的事,但我看不到它。

java.util.regex.Pattern的Javadoc在其“此类不支持的Perl构造列表” java.util.regex.Pattern明确提及\v 。 所以它不属于Java的“垂直空白”类别; 这就是Java没有“垂直空白”类别。

编辑添加:相反, \v代表垂直制表符U + 000B 。 这是一个传统的逃脱序列; 还有一些其他传统的转义序列在Java字符串文字中是不允许的,但Pattern支持( \a表示alert / bell, \cX表示控制字符X )。 但奇怪的是,Javadoc for Pattern没有提到它支持\v ; 所以我不确定是否可以在所有JDK实现中支持它。

perldoc perlrecharclass表示\v匹配“垂直空白字符”。 这进一步解释了:

“\ v”匹配任何被认为是垂直空格的字符; 这包括平台的回车符和换行符(换行符)以及其他几个字符,全部列在下表中。 “\ V”匹配任何不被视为垂直空格的字符。 它们使用平台的本机字符集,并且不考虑可能正在使用的任何区域设置。

具体来说, \v与5.16中的以下字符匹配:

 $ unichars -au '\v' # From Unicode::Tussle ---- U+0000A LINE FEED ---- U+0000B LINE TABULATION ---- U+0000C FORM FEED ---- U+0000D CARRIAGE RETURN ---- U+00085 NEXT LINE ---- U+02028 LINE SEPARATOR ---- U+02029 PARAGRAPH SEPARATOR 

您可以使用字符类来获得与Perl的\v相同的效果。

当然这适用于Perl; 我不知道它是否适用于Java。