Я очень озадачен тем, почему это происходит, и надеюсь, что кто-нибудь сможет объяснить механику того, что происходит в движке регулярных выражений.
Во время работы над упражнением codewars «Вы имели в виду…?» в Javascript я пытался подсчитать, сколько символов в слове 1 появляется в слове 2. Я пытаюсь сопоставить каждый символ как свою собственную группу совпадений, чтобы позже я мог подсчитать количество успешных совпадений в массиве и использовать это, чтобы узнать, насколько похожи два слова.
Пожалуйста, не давайте мне советов, как решить задачу codewars, просто помогите мне понять, что здесь происходит.
Я старался:
'berry'.match(/(c?)(h?)(e?)(r?)(r?)(y?)/)
и не нашел совпадений
> ["", "", "", "", "", "", ""]
Это загадка для меня. При поиске Regular-expressions.info ?
(сделать предшествующий символ необязательным) является жадным, поэтому, хотя для регулярного выражения нет допустимых совпадений, не должна ли она сначала превзойти жадную версию? Я ожидал этого:
> ["", "", "", "e", "r", "r", "y"]
Другие вещи, которые я пробовал: - Cherry Match Cherry работает, как я и ожидал
'cherry'.match(/(c?)(h?)(e?)(r?)(r?)(y?)/)
> ["cherry", "c", "h", "e", "r", "r", "y"]
Cherl Match Cherl работает так, как я и ожидал
'cherl'.match(/(c?)(h?)(e?)(r?)(r?)(y?)/)
> ["cher", "c", "h", "e", "r", "", ""]
И если я уберу ?
из финального y
, он тоже будет работать как положено:
'berry'.match(/(c?)(h?)(e?)(r?)(r?)(y)/)
> ["erry", "", "", "e", "r", "r", "y"]
Так почему же добавление ?
к конечному y
означает, что я больше не вижу совпадающих символов?
Хотя я пробовал это в JS, я получаю то же самое в PY и PCRE.
?
означает "один или ничего" и всегда соответствует действительности: если ничего не найдено, это считается совпадением. Он жаден до тех пор, пока пытается найти что-то первым (вместо противоположного квантификатора ленивости: постарайтесь удовлетвориться ничего). - person Jan   schedule 19.02.2016/g
в JS, поэтому получили одно совпадение: пустое место в начале строки. Взгляните на эту демонстрацию - person Wiktor Stribiżew   schedule 19.02.2016g
он находит совпадение с нулевыми символами в самом начале строки. - person samjewell   schedule 19.02.2016