2014-07-24 5 views
0

Я узнал об ошибке сериализации ... теперь я должен заплатить за это. В моей БД, у меня есть записи, где атрибут Строка выглядит следующим образом:Использование REGEX для анализа сериализованных данных

"---\n- '0'\n- Tent\n- '0'\n- '0'\n- Sleeping pad\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n"

Есть простой способ разобрать только два пункта внутри? В этом случае элементы палатка и пенка, но обратите внимание, что в этих длинных строках, может быть любое количество предметов, скрытых ...

FYI это Рубин на рельсах 4.

+0

что ваш ожидаемый выход? Ввод - это строка, которую вы указали, выход - «Палатка спящей площадки» или что? – trainoasis

+0

В идеале я хотел бы, чтобы результат был «Палатка, Спящая подкладка, следующий элемент и т. Д.», Поэтому я могу преобразовать в массив и затем запустить перечислимый через нее. – james

ответ

1

Ok извините, не украсть чью-то гром, но я буквально не знаю RegEx на всех, так что я не был уверен, где поместить строку кода. Я закончил с использованием чистого рубинового путь, хотя, просто:

long_string = "---\n- '0'\n- Tent\n- '0'\n- '0'\n- Sleeping pad\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n" 
new_array = long_string.split("\n- ") 
#mimic what the serialization function does, which is splitting up each of the items with the "\n- " thing 

new_array.select! { |t| ("A".."Z").include? t[0] } 
#select only elements of the newly created array where the first character is a capital letter, since it works out that all my items would start with a capital letter 

Выход в этом случае будет => ["Tent", "Sleeping pad"]

0

С этой записью, вам понадобится следующая строка, чтобы сорвать эти слова

(?<=^|\\n-\s)([\p{L} ]+?)(?=\\n) 

Используйте это, если U havent «ленивый».

(?<=^|\\n-\s)([a-zA-Z ]+?)(?=\\n) 
+0

Привет, как именно я использую это? когда у меня есть «предметы» как объект? Я пробовал делать «items.split ...», но, похоже, это требовало больше информации. Благодаря! – james

+1

Я не знаю о регулярном выражении Ruby, но, возможно, это может помочь: http://regex101.com/r/rX5jU9/1 Его почти то же самое, что и его второе регулярное выражение (кроме группы без захвата, добавленной в начале с? :), и это работает. Не забудьте сделать глобальный матч. – trainoasis

+0

Ох - протестировал его здесь, а мое отредактированное регулярное выражение найдет оба слова http://rubular.com/ (поместите свою строку в и отредактированное регулярное выражение) – trainoasis

Смежные вопросы