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