Включение / выключение жадности в повторных шаблонах замыкания - PullRequest
5 голосов
/ 13 января 2012

Как включить / выключить жадность в повторных шаблонах clojure?

(re-find #"(.+)-(.+)" "hello-world-you") => ["hello-world-you" "hello-world" "you"]

против

(re-find #"(.+)-(.+)" "hello-world-you") => ["hello-world-you" "hello" "world-you"]

Ответы [ 2 ]

18 голосов
/ 13 января 2012

? делает квантификаторы, такие как +, нежадными.По умолчанию они жадные.

  • Жадность: (.+)
  • Нежадность: (.+?)

Кстати,это просто прямой, простой и точный ответ.Ответ @ fge предполагает лучший способ сделать это.Проверьте это для будущих выражений.

12 голосов
/ 13 января 2012

Не используйте .+, используйте дополненный класс символов: это позволяет вообще не заботиться о жадности.

Вы должны использовать это как регулярное выражение: ([^-]+)-([^-]+).

Всегда делайте все возможное, чтобы как можно лучше оценить ваш вклад.Здесь вы хотите сопоставить все, что не является тире, один или несколько раз, и захватить его (([^-]+)), затем тире (-), затем (снова) все, что не является тире, один или несколько раз, изахватить его (([^-]+)).

Полагаться на (не) жадность квантификаторов - это фундаментальная ошибка, если вы знаете, что можете описать свой ввод без опоры на него.Это не только источник ошибок (как вы сами демонстрируете), но и препятствие для работы механизма регулярных выражений с максимальной эффективностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...