10

从逻辑上讲,它是(但无论何时使用字符编码或语言环境,逻辑都无关紧要)。根据

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

打印“y”,它是。根据

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

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

Sun 为 JDK7 更新的 Pattern 类有一个了不起的新标志 UNICODE_CHARACTER_CLASS,它可以让一切再次正常工作。

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

4

2 回答 2

20

Java 7 的 Javadocjava.util.regex.Pattern\v在其“此类不支持的 Perl 构造列表”中明确提及。所以这不是\n不属于Java的“垂直空白”类别;就是 Java 7 没有“垂直空白”类别。相反,Java 7 正则表达式有一个未记录的特性,它们解释\v为引用垂直制表符U+000B。(这是来自 C/C++/Bash/etc. 的传统转义序列,尽管 Java 字符串文字支持它。\a对于 alert/bell 和\cXcontrol-character也是如此X。)

编辑添加:这在 Java 的较新版本中发生了变化。根据Java 8的 Javadoc forjava.util.regex.Pattern\v现在的意思是“垂直空白字符:[\n\x0B\f\r\x85\u2028\u2029]”。

于 2012-09-05T21:48:32.037 回答
11

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。

于 2012-09-05T21:53:06.263 回答