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

maa*_*nus 8 java regex unicode perl

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

perl -e 'print "\n" =~ /\v/ ? "y\n" : "n\n";'
Run Code Online (Sandbox Code Playgroud)

打印"y",它是.根据

Pattern.compile("\\v").matcher("\n").matches();
Run Code Online (Sandbox Code Playgroud)

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

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

但我使用的是java版本"1.7.0_07"并且该标志存在并且似乎根本没有任何改变.此外,"\n"是不是初来乍到的Unicode而是一个普通的老ASCII字符,所以我实在看不出这种差异可能是如何发生的.可能我做的事情很愚蠢,但我看不到.

rua*_*akh 17

Javadocjava.util.regex.Pattern\v在其"此类不支持的Perl构造列表"中明确提及.所以它\n并不属于Java的"垂直空白"类别; 它是Java不具备 "垂直空白"的范畴.

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


Kei*_*son 9

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
Run Code Online (Sandbox Code Playgroud)

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

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