Регулярное выражение для сопоставления всех слов между набором фигурных скобок - PullRequest
10 голосов
/ 06 февраля 2010

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

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

sentence = hello {name} is {thing}

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

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

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

Ответы [ 2 ]

21 голосов
/ 06 февраля 2010

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

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

sentence.scan(/\{(.*?)\}/)
# => [["name"], ["thing"]]
0 голосов
/ 28 мая 2019

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

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

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

str = "hello {my {name} is {thing} from} the swamp"
str.scan /(?<=\{)[^{]*?(?=\})/
  #=> ["name", "thing"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...