Jestem w pewnym sensie nowy dla wyrażeń regularnych z Ruby (lub ogólnie rzecz biorąc regex), ale zastanawiałem się, czy istnieje pragmatyczny sposób na dopasowanie ciągu znaków za pomocą tablicy?Ruby dopasowujące ciągi regex z tablicy?
Pozwól mi wyjaśnić, że mam listę składników w tym przypadku:
1 1/3 cups all-purpose flour
2 teaspoons ground cinnamon
8 ounces shredded mozzarella cheese
Ostatecznie muszę podzielić składniki w odpowiedniej „ilości i miary” oraz „Nazwa składnika”, tak jak w przypadek 2 teaspoons ground cinnamon
, zostanie podzielona na "8 ounces
i shredded mozzarella cheese
więc zamiast o niezwykle długiej regex takich jak:. (cup\w*|teaspoon\w*ounce\w* .......)
, w jaki sposób można wykorzystać tablicę do przechowywania tych wartości poza regex
aktualizacja
zrobiłem to (dzięki cwninja):
# I think the all units should be just singular, then
# use ruby function to pluralize them.
units = [
'tablespoon',
'teaspoon',
'cup',
'can',
'quart',
'gallon',
'pinch',
'pound',
'pint',
'fluid ounce',
'ounce'
# ... shortened for brevity
]
joined_units = (units.collect{|u| u.pluralize} + units).join('|')
# There are actually many ingredients, so this is actually an iterator
# but for example sake we are going to just show one.
ingredient = "1 (10 ounce) can diced tomatoes and green chilies, undrained"
ingredient.split(/([\d\/\.\s]+(\([^)]+\))?)\s(#{joined_units})?\s?(.*)/i)
To daje mi blisko tego, co chcę, więc myślę, że jest to kierunek chcę iść.
puts "measurement: #{arr[1]}"
puts "unit: #{arr[-2] if arr.size > 3}"
puts "title: #{arr[-1].strip}"
Używam również tego podejścia, z małą korektą: Regexp.union (pomiary) zamiast Regexp.new (measurement.join ("|")), ten sam wynik, znacznie czystszy – Coelhone