\s
- самый короткий и самый непереносимый параметр для указания символа пробел .Хотя портировать Java-код на другие языки редко, речь идет скорее о переносе знаний о синтаксисе одного механизма регулярных выражений в другой.Существует множество механизмов регулярных выражений, использующих Perl-подобный синтаксис, поэтому разница в интерпретации для того же синтаксиса, как \s
, смущает программистов.
Помимо пробела (ASCII 32), новая строка (\n
, ASCII 10), горизонтальная табуляция (\t
, ASCII 9), возврат каретки (\r
, ASCII 13) и подача формы (\f
, ASCII 12), нет единого мнения о том, что символьный пробел различается между различными механизмами.
Java, POSIX (ASCII): также включает вертикальную вкладку (ASCII 11).Кажется, что здесь Java следует стандарту POSIX.
JavaScript (редакция 5.1): Согласно спецификациям (дословно), кроме 5 распространенныхвключает в себя:
Категория Unicode Zs (Разделитель / Пробел) , \u2028
(Разделитель строк), \u2029
(Разделитель абзацев).В основном он включает все символы категории Z (разделитель).
На самом деле \u2028
является единственным членом категории Zl (разделитель / строка) , а \u2029
- этоединственный член категории Zp (Разделитель / Абзац) .Согласно формулировке, возможно, что текущая версия спецификаций исключит какое-либо дальнейшее расширение для этих 2 категорий.
- Вертикальная вкладка
\v
- Порядок следования байтов aka ZERO WIDTH NO-BREAK SPACE
\ufeff
Perl , PCRE (режим ASCII): вертикальная вкладка \v
добавлено из Perl 5.18 в качестве эксперимента.До версии 5.18 он соответствует только 5 наиболее распространенным.
Perl (режим Unicode): кроме 5 распространенных
- Unicode категория Z (разделитель)
- Вертикальная табуляция
\v
добавлена из Perl 5.18 в качестве эксперимента. - СЛЕДУЮЩАЯ ЛИНИЯ (NEL)
\u0085
- Монгольский разделитель гласных
\u180e
.NET (по умолчанию): кроме 5 распространенных
- Unicode категория Z(Разделитель)
- Вертикальная вкладка
\v
- СЛЕДУЮЩАЯ ЛИНИЯ (NEL)
\u0085
Java (Unicode): из Java7, класс Pattern включает новый флаг UNICODE_CHARACTER_CLASS
, который делает предопределенные классы символов и классы символов POSIX соответствуют Технический стандарт Unicode # 18: UnicodeРегулярное выражение .Когда флаг активен, Предопределенный класс символов и соответствующий POSIX класс символов станут эквивалентными (совпадают с одинаковыми).
Список символов одинаковкак .NET.
Этого достаточно, чтобы свести с ума!
\p{Space}
- более «стабильный» вариант, поскольку он следует за Стандарт POSIX в режиме по умолчанию и Технический стандарт Unicode # 18: Регулярное выражение Unicode в UNICODE_CHARACTER_CLASS
.
Если вы используете класс символов POSIX, совместимая с POSIX реализация будет иметьтакое же поведение в режиме ASCII, и движки регулярных выражений Unicode, которые следуют рекомендациям, будут иметь ( почти ) такое же поведение в режиме Unicode.
\s
и \p{Space}
эквивалентны в Javaнезависимо от флага.Если вы используете \s
в Java, вы можете быть уверены, что следуете некоторому стандарту / рекомендации.Просто он не сообщает большинству программистов об этом факте.
\p{isJavaWhitespace}
для сопоставления пробелов согласно определению Java .Название функции вводит в заблуждение.