Если вы напишите код на SQL так, что вас не будет интересовать КАК он выполяется — вы далеко не уедете. Я согласен, что не должно быть очевидно. И я согласен, что надо писать ЧТО нас интересует, а не как. Но при этом надо обязательно знать КАК это работает внутри. Иначе можно получить «странные и непонятные» баги, проблемы с производительностью, продолжить по вкусу.
Я ставил цель показать почему кеш на самом деле один на всю программу. Если вы напишите то же самое на C# он будет новый каждый раз, если вы конечно не примените похожую схему, засунув его в замыкание и позаботившись чтобы оно использовалось каждый раз.
Я не думаю что это очевидно с первого взгляда, особенно когда смотришь на весь этот синтаксис F# :)
Тогда будет работать, но только без вложенных скобок. Поиск для второй строки будет опять неправильный, поскольку через регэксп в общем случае нельзя задать произвольную глубину проверки сбалансированности скобок. Только до какой-то заранее заданной. Причем для глубины 2 будет уже приличное выражение, которое даже автор не сходу поймет.
Выше уже пояснили, но хочу лобавить, что как раз один из тех терминов, для которого все переводы для непосвященного не очевидны.
Когда я первый раз увидел перевод «экранировать» тоже не смог сразу найти.
Забыли заматчить «не раму». Negative lookahead совпадает (правильно, конечно, «не совпадает», то так можно мозг сломать) с позицией, а не подвыражением, соответственно захватится только «Мама мыла » в строке «Мама мыла Ваню».
Гуглите в сторону «negative lookahead» (как в примере Terion), либо «negative lookbehind» (как в моем) для своего языка. Обычно синтаксис этой части совпадает.
Можно использовать поисковые конструкции чтобы исключить совпадение рамы.
Что-то типа ^Мама мыла (\w+)(?<! раму)$. Вторая часть (?! раму) говорит что в этой позиции подвыражение не должно совпадать назад (то что уже захватили в \w+). Но опять же надо понимать, что текст должен совпадать с НЕ рамой. В данном случае это не критично, потому что с \w идет квантификатор +, который требует хотя бы одной этой самой \w. Если бы стояла *, то были бы отличия в поведении.
А в них нет ничего страшного :)
Если дойдут руки, то хочу поверхностно описать как устроены эти самые регэкспы внутри. Очень важно для понимания регэкспов в целом.
Я не думаю что это очевидно с первого взгляда, особенно когда смотришь на весь этот синтаксис F# :)
Когда я первый раз увидел перевод «экранировать» тоже не смог сразу найти.
Что-то типа ^Мама мыла (\w+)(?<! раму)$. Вторая часть (?! раму) говорит что в этой позиции подвыражение не должно совпадать назад (то что уже захватили в \w+). Но опять же надо понимать, что текст должен совпадать с НЕ рамой. В данном случае это не критично, потому что с \w идет квантификатор +, который требует хотя бы одной этой самой \w. Если бы стояла *, то были бы отличия в поведении.
Если дойдут руки, то хочу поверхностно описать как устроены эти самые регэкспы внутри. Очень важно для понимания регэкспов в целом.