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 Введите строку ввода для поиска: Совпадения не найдено.

Введите регулярное выражение: .
Введите строку ввода для поиска: 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
Введите строку ввода для поиска:
Совпадения не найдено.