regex — В чем разница между [\s\S]*? и .*? в регулярных выражениях Java?

спросил

Изменено 4 месяца назад

Просмотрено 16 тысяч раз

Я разработал регулярное выражение для идентификации блока XML внутри текстового файла. Выражение выглядит следующим образом (я удалил все escape-символы java, чтобы его было легче читать): 9\s] , поэтому [\s\S] логически должно быть эквивалентно . Я не использовал жадные фильтры, в чем может быть разница?

  • Java
  • регулярное выражение
  • xml
4

Регулярные выражения . и \s\S не эквивалентны, так как . по умолчанию не улавливает терминаторы строк (например, новую строку).

По данным сайта оракула, . совпадений

Любой символ (может совпадать или не совпадать с разделителями строк)

, в то время как терминатор строки может быть одним из следующих:

  • Символ новой строки (перевод строки) ( '\n' ),
  • Символ возврата каретки, за которым сразу следует символ новой строки ( "\r\n" ),
  • Отдельный символ возврата каретки ( '\r' ),
  • Символ следующей строки ( '\u0085' ),
  • Символ-разделитель строк ( '\u2028' ) или
  • Символ-разделитель абзаца ( '\u2029 ).

Два выражения не эквивалентны, пока не установлены необходимые флаги. Снова цитируя сайт оракула:

Если активирован режим UNIX_LINES , то только разделители строк распознаются символы новой строки.

Регулярное выражение . соответствует любому символу, кроме строки терминатор, если только Указан флаг DOTALL .

0

Вот лист, объясняющий все команды регулярных выражений.

По сути, \s\S подберет все символы, включая символы новой строки. В то время как

. не захватывает терминаторы строк по умолчанию (для их захвата необходимо установить определенные флаги).

4

это как в javascript, хотя я не привык к java, но java — это тип программы, и он очень полезен в нашей реальной жизни.

1

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

Предопределенные классы символов (Учебные руководства по Java™ > Основные классы Java > Регулярные выражения)

« Предыдущий • След. Pattern

API содержит ряд полезных предопределенных классов символов , которые предлагают удобные сокращения для часто используемых регулярных выражений:

9\w]
Construct Описание

В приведенной выше таблице каждая конструкция в левом столбце является сокращением для класса символов в правом столбце. Например, \d означает диапазон цифр (0-9), а \w означает символ слова (любая строчная буква, любая заглавная буква, символ подчеркивания или любая цифра). По возможности используйте предопределенные классы. Они упрощают чтение кода и устраняют ошибки, вызванные неправильно сформированными классами символов.

Конструкции, начинающиеся с обратной косой черты, называются экранированными конструкциями . Мы предварительно рассмотрели экранированные конструкции в Раздел строковых литералов, где мы упомянули использование обратной косой черты и \Q и \E для цитирования. Если вы используете экранированную конструкцию внутри строкового литерала, вы должны поставить перед обратной косой чертой другую обратную косую черту, чтобы строка скомпилировалась. Например:

private final String REGEX = "\\d"; // одна цифра
 

В этом примере \d — регулярное выражение; дополнительная обратная косая черта требуется для компиляции кода. Однако тестовая программа считывает выражения непосредственно из консоли , поэтому дополнительная обратная косая черта не нужна.

Следующие примеры демонстрируют использование предопределенных классов символов.

 Введите регулярное выражение: .
Введите строку ввода для поиска: @
Я нашел текст "@", начинающийся с индекса 0 и заканчивающийся индексом 1. Введите регулярное выражение: .
Введите строку ввода для поиска: 1
Я нашел текст «1», начинающийся с индекса 0 и заканчивающийся индексом 1.
Введите регулярное выражение: .
Введите входную строку для поиска: a
Я нашел текст «а», начинающийся с индекса 0 и заканчивающийся индексом 1.
Введите регулярное выражение: \d
Введите строку ввода для поиска: 1
Я нашел текст «1», начинающийся с индекса 0 и заканчивающийся индексом 1.
Введите регулярное выражение: \d
Введите входную строку для поиска: a
Совпадения не найдено.
Введите регулярное выражение: \D
Введите строку ввода для поиска: 1
Совпадения не найдено.
Введите регулярное выражение: \D
Введите входную строку для поиска: a
Я нашел текст «а», начинающийся с индекса 0 и заканчивающийся индексом 1.
Введите регулярное выражение: \s
Введите строку ввода для поиска:
Я нашел текст " ", начинающийся с индекса 0 и заканчивающийся индексом 1.
Введите регулярное выражение: \s
Введите входную строку для поиска: a
Совпадения не найдено.
Введите регулярное выражение: \S
Введите строку ввода для поиска:
Совпадения не найдено.