regex — В чем разница между [\s\S]*? и .*? в регулярных выражениях Java?
спросил
Изменено 4 месяца назад
Просмотрено 16 тысяч раз
Я разработал регулярное выражение для идентификации блока XML внутри текстового файла. Выражение выглядит следующим образом (я удалил все escape-символы java, чтобы его было легче читать): 9\s] , поэтому [\s\S]
логически должно быть эквивалентно .
Я не использовал жадные фильтры, в чем может быть разница?
- Java
- регулярное выражение
- xml
Регулярные выражения .
и \s\S
не эквивалентны, так как .
по умолчанию не улавливает терминаторы строк (например, новую строку).
По данным сайта оракула, .
совпадений
Любой символ (может совпадать или не совпадать с разделителями строк)
, в то время как терминатор строки может быть одним из следующих:
- Символ новой строки (перевод строки) (
'\n'
),- Символ возврата каретки, за которым сразу следует символ новой строки (
"\r\n"
),- Отдельный символ возврата каретки (
'\r'
),- Символ следующей строки (
'\u0085'
),- Символ-разделитель строк (
'\u2028'
) или- Символ-разделитель абзаца (
'\u2029
).
Два выражения не эквивалентны, пока не установлены необходимые флаги. Снова цитируя сайт оракула:
0Если активирован режим
UNIX_LINES
, то только разделители строк распознаются символы новой строки.Регулярное выражение
.
соответствует любому символу, кроме строки терминатор, если толькоУказан флаг DOTALL
.
Вот лист, объясняющий все команды регулярных выражений.
По сути, \s\S
подберет все символы, включая символы новой строки. В то время как
не захватывает терминаторы строк по умолчанию (для их захвата необходимо установить определенные флаги).
это как в javascript, хотя я не привык к java, но java — это тип программы, и он очень полезен в нашей реальной жизни.
1Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя электронную почту и парольОпубликовать как гость
Электронная почтаТребуется, но никогда не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
Предопределенные классы символов (Учебные руководства по Java™ > Основные классы Java > Регулярные выражения)
« Предыдущий • След. Pattern
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 Введите строку ввода для поиска: Совпадения не найдено.