Многие механизмы регулярных выражений сопоставляют .* дважды в однострочной строке, например, при выполнении замены строки на основе регулярного выражения:
Первое совпадение — это, по определению, вся (однострочная) строка, как и ожидалось.
Во многих движках есть Второе совпадение, а именно пустая строка; то есть, даже если первое совпадение поглотило всю входную строку, .* сопоставляется снова, что затем соответствует пустой строке в конце входной строки.
Примечание. Чтобы гарантировать, что найдено только одно совпадение, используйте ^.*
Мои вопросы:
Есть ли веская причина для такого поведения? После того, как входная строка будет использована полностью, я бы не ожидал еще одной попытки найти совпадение.
Можете ли вы почерпнуть что-то кроме метода проб и ошибок? документация/диалект/стандарт регулярных выражений поддерживает, какие механизмы демонстрируют такое поведение?
Обновить: полезный ответ revo объясняет как текущего поведения; что касается потенциального почему, см. этот связанный вопрос.
Языки/платформы, которые ДЕЙСТВИТЕЛЬНО демонстрируют такое поведение:
# .NET, via PowerShell (behavior also applies to the -replace operator)
PS> [regex]::Replace('a', '.*', '[$&]'
[a][] # !! Note the *2* matches, first the whole string, then the empty string
Многие механизмы регулярных выражений сопоставляют .* дважды в однострочной строке, например, при выполнении замены строки на основе регулярного выражения:
[list] [*]Первое совпадение — это, по определению, вся (однострочная) строка, как и ожидалось. [*]Во многих движках есть Второе совпадение, а именно пустая строка; то есть, даже если первое совпадение поглотило всю входную строку, .* сопоставляется снова, что затем соответствует пустой строке в конце входной строки.
Примечание. Чтобы гарантировать, что найдено только одно совпадение, используйте ^.* [/list]
Мои вопросы:
[list] [*]Есть ли веская причина для такого поведения? После того, как входная строка будет использована полностью, я бы не ожидал еще одной попытки найти совпадение. [*]Можете ли вы почерпнуть что-то кроме метода проб и ошибок? документация/диалект/стандарт регулярных выражений поддерживает, какие механизмы демонстрируют такое поведение? [/list]
[b]Обновить: полезный ответ revo объясняет как текущего поведения; что касается потенциального почему, см. этот связанный вопрос.
Языки/платформы, которые ДЕЙСТВИТЕЛЬНО демонстрируют такое поведение:
# .NET, via PowerShell (behavior also applies to the -replace operator) PS> [regex]::Replace('a', '.*', '[$&]' [a][] # !! Note the *2* matches, first the whole string, then the empty string
Работа с фреймом данных pandas, попытка очистить столбец от $12 342 до 12342 и преобразовать столбец в число int или число с плавающей запятой. Однако я нашел одну строку с 736 , поэтому мне пришлось удалить все, что находится в квадратных скобках,...
Il Messaggero Рим 22 сентября 2023 г. Il Messaggero Рим 21 сентября 2023 г. Иль Мессаггеро 22 сентября 2023 г. Иль Мессаггеро 21 сентября 2023 г. Il Messaggero Рим 21 августа 2023 г. Il Messaggero Рим 20...