Является ли "\n" вертикальным пробелом, т.е. Соответствует ли ему "\ v"?
Логически, это (но логика не имеет значения всякий раз, когда в кодировке символов или локалях). Согласно
perl -e 'print "\n" =~ /\v/ ? "y\n" : "n\n";'
печать "y", это так. Согласно
Pattern.compile("\\v").matcher("\n").matches();
возвращает false
в java, это не так. Это меня не смутило бы, если бы не это сообщение, утверждающее, что
Обновление Suns Класс шаблонов для JDK7 имеет новый новый флаг UNICODE_CHARACTER_CLASS, который заставляет все снова работать снова.
Но я использую java-версию "1.7.0_07", и флаг существует и, кажется, ничего не меняет. Более того, "\n" не новичок в Unicode, а простой старый символ ASCII, поэтому я действительно не вижу, как это может произойти. Вероятно, я делаю что-то глупое, но я не вижу этого.
Ответы
Ответ 1
Javadoc для java.util.regex.Pattern
явно упоминает \v
в своем "списке конструкций Perl, не поддерживаемых этим классом". Так что это не то, что \n
не относится к категории Java "вертикальные пробелы"; что Java не имеет категории "вертикальных пробелов".
Отредактировано для добавления: Вместо этого \v
обозначает символ вертикальной вкладки, U + 000B. Это традиционная escape-последовательность; есть также несколько других традиционных escape-последовательностей, которые не допускаются в строковых литералах Java, но поддерживаются Pattern
(\a
для предупреждения/звонка, \cX
для контрольного символа X
). Однако, как ни странно, Javadoc для Pattern
не упоминает, что поддерживает \v
; поэтому я не уверен, можно ли ожидать, что он будет поддерживаться во всех реализациях JDK.
Ответ 2
perldoc perlrecharclass
говорит, что \v
соответствует "символу вертикальной пробела". Это объясняется далее:
"\ v" соответствует любому символу, который считается вертикальным пробелом; это включает символы возврата каретки платформы и строки (newline) плюс несколько других символов, все перечисленные в таблице ниже. "\ 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.