Те люди, которые используют \s
в Java для обнаружения пробелов в коде Java, делают по крайней мере одну, а может и несколько ошибок.
Прежде всего, идея компилятора Java о собственном пробеле не соответствует тому, что \s
соответствует в Java. Вы можете получить доступ к Java Character.isWhitespace()
через свойство \p{JavaWhitespace}
.
Во-вторых, Java не позволяет \s
соответствовать пробелам Юникода; как реализовано в классе Java Pattern
, \s
соответствует только пробелам ASCII. На самом деле, Java не поддерживает никаких свойств, соответствующих пробелам Юникода.
Вот таблица, показывающая некоторые проблемные области:
000A 0085 00A0 2029
J P J P J P J P
\s 1 1 0 1 0 1 0 1
\pZ 0 0 0 0 1 1 1 1
\p{Zs} 0 0 0 0 1 1 0 0
\p{Space} 1 1 0 1 0 1 0 1
\p{Blank} 0 0 0 0 0 1 0 0
\p{Whitespace} - 1 - 1 - 1 - 1
\p{javaWhitespace} 1 - 0 - 0 - 1 -
\p{javaSpaceChar} 0 - 0 - 1 - 1 -
На оси X вы видите четыре разных кодовых точки:
U+000A: LINE FEED (LF)
U+0085: NEXT LINE (NEL)
U+00A0: NO-BREAK SPACE
U+2029: PARAGRAPH SEPARATOR
У оси Y есть восемь различных тестов регулярных выражений, в основном свойства. Для каждой из этих кодовых точек есть и столбец J-результатов для Java, и столбец P-результатов для Perl или любого другого обработчика регулярных выражений на основе PCRE.
Это большая проблема. Java просто испорчена, давая «неправильные» ответы в соответствии с существующей практикой, а также в соответствии с Unicode. Кроме того, Java даже не дает вам доступа к реальным свойствам Unicode. Для записи это кодовые точки со свойством пробела Unicode:
% unichars '\pP{Whitespace}'
0009 CHARACTER TABULATION
000A LINE FEED (LF)
000B LINE TABULATION
000C FORM FEED (FF)
000D CARRIAGE RETURN (CR)
0020 SPACE
0085 NEXT LINE (NEL)
00A0 NO-BREAK SPACE
1680 OGHAM SPACE MARK
180E MONGOLIAN VOWEL SEPARATOR
2000 EN QUAD
2001 EM QUAD
2002 EN SPACE
2003 EM SPACE
2004 THREE-PER-EM SPACE
2005 FOUR-PER-EM SPACE
2006 SIX-PER-EM SPACE
2007 FIGURE SPACE
2008 PUNCTUATION SPACE
2009 THIN SPACE
200A HAIR SPACE
2028 LINE SEPARATOR
2029 PARAGRAPH SEPARATOR
202F NARROW NO-BREAK SPACE
205F MEDIUM MATHEMATICAL SPACE
3000 IDEOGRAPHIC SPACE
Если хотите, можете взять программу unichars и поиграть с ней и сопутствующими программами, uniprops и uninames . Я еще не добавил свойства только для Java, но собираюсь. Слишком много неприятных сюрпризов, подобных описанным выше.
Можно ли поверить, что в Java есть свойство \p{javaJavaIdentifierStart}
? Я не шучу. Но вы не поверите, что символы, которые компилятор фактически позволяет вам использовать в идентификаторах; на самом деле вы бы не Кто-то не обращал внимания. Снова. (