“\ 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。