Является ли "\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.