Регулярное выражение для сопоставления всех слов между набором фигурных скобок

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

Я использую это примерное предложение:

sentence = hello {name} is {thing}

с этим регулярным выражением, чтобы попытаться вернуть оба "{name}" и "{thing}":

sentence[/\{(.*?)\}/]

Однако Ruby возвращает "{name}". Может ли кто-нибудь объяснить, почему он не подходит для обоих слов?

Ответ 1

Вы близки, но используете неправильный метод:

sentence = "hello {name} is {thing}"

sentence.scan(/\{(.*?)\}/)
# => [["name"], ["thing"]]

Ответ 2

Можно сделать это с помощью положительного взгляда за спиной (?<=\{), Чтобы потребовать, чтобы перед матчем немедленно предшествовала левая фигурная скобка, и позитивного взгляда, чтобы потребовать, чтобы за матчем немедленно последовала правая фигурная скобка.

str = "hello {name} is {thing}"
str.scan /(?<=\{).*?(?=\})/
  #=> ["name", "thing"]

Если могут быть вложенные фигурные скобки и нужны только строки внутри внутренних фигурных скобок, .*? необходимо заменить на [^{\]*:

str = "hello {my {name} is {thing} from} the swamp"
str.scan /(?<=\{)[^{]*?(?=\})/
  #=> ["name", "thing"]