Как выбрать между пробелами? - PullRequest
5 голосов
/ 15 февраля 2012

В документации Oracle Pattern есть описание трех различных шаблонов для сопоставления пробелов:

  1. \ s
  2. \ p {Пробел}
  3. \ p {javaWhitespace}

Мне интересно, в чем специфика каждого из них и как узнать, как выбрать правильный.Я только что заметил, что \p{javaWhitespace} включает больше пробелов.

Ответы [ 3 ]

5 голосов
/ 12 января 2014

\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 .Название функции вводит в заблуждение.

4 голосов
/ 15 февраля 2012

Я бы предпочел использовать первое.

  • Оно компактно
  • Это те же обозначения во многих других языках, а также в теории регулярных выражений
  • \p{javaWhitespace} включают FILE SEPARATOR, GROUP SEPARATOR и т. Д. ... см. это .Использование его, когда они не нужны, может запутать кого-то другого.
  • В общем, я бы ожидал, что другой программист узнает, что такое \s, в то время как я ожидаю, что они дважды проверит, какое именно определение \p{javaWhitespace},Вы не хотите этого, поскольку это уменьшает ясность кода и добавляет ненужную нагрузку во время отладки.
0 голосов
/ 15 февраля 2012

Если у вас нет конкретной причины использовать другие опции, я бы оставил это простым и использовал \s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...