10

論理的にはそうです(ただし、文字エンコードまたはロケールが機能している場合は常にロジックは関係ありません)。によると

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

「y」を印刷します。によると

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

falseJavaで返されますが、そうではありません。それを主張するこの投稿がなかったとしても、これは私をまったく混乱させません。

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の「垂直空白」のカテゴリに属していないわけではありません。Java7には「垂直空白」のカテゴリがないということです。代わりに、Java 7正規表現には文書化されていない機能があり\v、垂直タブ文字U+000Bを参照していると解釈されます。(これはC / C ++ / Bashなどからの従来のエスケープシーケンスですが、Java文字列リテラルはサポートしていません。同様\aにalert / bellおよび\cXcontrol-characterの場合も同様Xです。)

追加のために編集:これは、Javaの新しいバージョンで変更されました。Java 8のJavadocにjava.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 に答える