- Первое совпадение — это, по определению, вся (однострочная) строка, как и ожидалось.
- Во многих движках есть Второе совпадение, а именно пустая строка; то есть, даже если первое совпадение поглотило всю входную строку, .* сопоставляется снова, что затем соответствует пустой строке в конце входной строки.
Примечание. Чтобы гарантировать, что найдено только одно совпадение, используйте ^.*
Мои вопросы:
- Есть ли веская причина для такого поведения? После того, как входная строка будет использована полностью, я бы не ожидал еще одной попытки найти совпадение.
- Можете ли вы почерпнуть что-то кроме метода проб и ошибок? документация/диалект/стандарт регулярных выражений поддерживает, какие механизмы демонстрируют такое поведение?
Языки/платформы, которые ДЕЙСТВИТЕЛЬНО демонстрируют такое поведение:
# .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
# Node.js
$ node -pe "'a'.replace(/.*/g, '[$&]')"
[a][]
# Ruby
$ ruby -e "puts 'a'.gsub(/.*/, '[\\0]')"
[a][]
# Python 3.7+ only
$ python -c "import re; print(re.sub('.*', '[\g]', 'a'))"
[a][]
# Perl 5
$ echo a | perl -ple 's/.*/[$&]/g'
[a][]
# Perl 6
$ echo 'a' | perl6 -pe 's:g/.*/[$/]/'
[a][]
# Others?
Языки/платформы, которые НЕ демонстрируют такое поведение:
# Python 2.x and Python 3.x
Подробнее здесь: https://stackoverflow.com/questions/523 ... put-string