Является ли "\n" вертикальным пробелом, т. Е. Должно ли оно соответствовать \v?

Логически, это так (но логика не имеет значения, когда кодировка символов или локали находятся в игре). В соответствии с

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

печать "у", это так. В соответствии с

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

возврате false в Java это не так. Это не смущало бы меня вообще, если бы не было этой публикации, утверждающей, что

Обновленный класс Pattern Sun для JDK7 имеет новый чудесный флаг UNICODE_CHARACTER_CLASS, который заставляет все снова работать правильно.

Но я использую версию Java 1.7.0_07, и флаг существует и, похоже, ничего не меняет. Более того, \n не новичок в Unicode, а просто старый ASCII-символ, так что я действительно не понимаю, как это может произойти. Возможно, я делаю что-то глупое, но не вижу этого.

2 ответа

Решение

Javadoc для java.util.regex.Pattern прямо упоминает \v в своем "списке конструкций Perl, не поддерживаемых этим классом". Так что это не так \n не относится к категории Java "вертикальные пробелы"; Дело в том, что у Java нет категории "вертикальных пробелов".

Отредактировано, чтобы добавить: вместо \v обозначает символ вертикальной табуляции, U + 000B. Это традиционная последовательность побега; Есть также несколько других традиционных escape-последовательностей, которые не допускаются в строковых литералах Java, но поддерживаются Pattern (\a для оповещения / звонка, \cX для управляющего персонажа X). Странно, однако, Javadoc для 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.

Другие вопросы по тегам