2016-01-05 7 views
0

Предположим, у меня есть строка с интерполяции заполнителей переменных:Regex для сопоставления строки с интерполяцией заполнителей

"The %s fox %s over the lazy %s" 

Для использования с оператором% (что это называется в этом контексте BTW?), Например:

"The %s fox %s over the lazy %s" % ["quick", "jumps", "dog"] 

Как бы я написать Regex выражение, которое будет соответствовать любой строке против этого uninterpolated строки

"The %s fox %s over the lazy %s" 
"The quick fox jumps over the lazy dog" 
"The 1 fox 2 over the lazy #@$#" 
+1

"(как это называется в этом контексте BTW?)" - [формат оператора] (http://ruby-doc.org/core-2.2.4/String.html#method-i-25). – Amadan

ответ

2

Простейшим является преобразование шаблона в регулярное выражение с заменой заполнителей на группы захвата - ничего.

strings = [ 
    "The %s fox %s over the lazy %s", 
    "The quick fox jumps over the lazy dog", 
    "The quick and agile fox nimbly jumps over the lazy son of a bitch", 
    "The quick fox defiantly crawls under the lazy dog" 
] 

pattern = "The %s fox %s over the lazy %s" 

pattern_re = /^#{Regexp.escape(pattern).gsub(/%s/, '(.*)')}$/ 
strings.map { |string| pattern_re.match(string) } 
# => [ 
#  #<MatchData "The %s fox %s over the lazy %s" 1:"%s" 2:"%s" 3:"%s">, 
#  #<MatchData "The quick fox jumps over the lazy dog" 1:"quick" 2:"jumps" 3:"dog">, 
#  #<MatchData "The quick and agile fox nimbly jumps over the lazy son of a bitch" 1:"quick and agile" 2:"nimbly jumps" 3:"son of a bitch">, 
#  nil 
# ] 
+1

Я интерпретировал вопрос по-другому, но ожидайте, что ваш - это то, что имел в виду ОП. Сначала я задавался вопросом, как вы знали, что собака была мужчиной, но потом вспомнила, что (среди заводчиков в любом случае), «собака» относится только к мужчинам. Если бы это была женщина, это была бы «сука сука». В любом случае «сука» очевидна (это как сказать «жареный цыпленок»). –