Как разбить строку в Ruby? - PullRequest
       23

Как разбить строку в Ruby?

2 голосов
/ 27 октября 2010

У меня есть специальные строки, такие как name1="value1" name2='value2'.Значения могут содержать пробелы и ограничиваться одинарными или двойными кавычками.Имена никогда не содержат пробелов.Пары имя / значение разделены пробелами.

Я хочу разобрать их в список пар имя-значение, как это

string.magic_split() => { "name1"=>"value1", "name2"=>"value2" }

Если бы Ruby понимал обходные утверждения, я мог бы сделать это с помощью

string.split(/[\'\"](?=\s)/).each do |element|
    element =~ /(\w+)=[\'\"](.*)[\'\"]/
    hash[$1] = $2
end

но Руби не понимает обходных утверждений, поэтому я несколько застрял.

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

Ответы [ 5 ]

6 голосов
/ 27 октября 2010

Это терпит неудачу с такими значениями, как «привет», сказала она, но может быть достаточно хорошим.

str = %q(name1="value1" name2='value 2')
p Hash[ *str.chop.split( /' |" |='|="/ ) ]
#=> {"name1"=>"value1", "name2"=>"value 2"}
2 голосов
/ 27 октября 2010

Это не полный ответ, но Oniguruma , стандартная библиотека регулярных выражений в 1.9 поддерживает косвенные утверждения. Его можно установить как драгоценный камень, если вы используете Ruby 1.8.x.

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

1 голос
/ 28 октября 2010

Это должно сделать это для вас.

 class SpecialString
   def self.parse(string)
     string.split.map{|s| s.split("=") }.inject({}) {|h, a| h[a[0]] = a[1].gsub(/"|'/, ""); h }
   end
 end
1 голос
/ 27 октября 2010
class String

  def magic_split
    str = self.gsub('"', '\'').gsub('\' ', '\'\, ').split('\, ').map{ |str| str.gsub("'", "").split("=") }
    Hash[str]
  end

end
0 голосов
/ 27 октября 2010

Попробуйте: /[='"] ?/

Я не знаю синтаксис Ruby, но вот сценарий Perl, который вы можете перевести

#!/usr/bin/perl 
use 5.10.1;
use warnings;
use strict;
use Data::Dumper;

my $str =  qq/name1="val ue1" name2='va lue2'/;

my @list = split/[='"] ?/,$str;
my %hash;
for (my $i=0; $i<@list;$i+=3) {
  $hash{$list[$i]} = $list[$i+2];
}
say Dumper \%hash;

Вывод:

$VAR1 = {
          'name2' => 'va lue2',
          'name1' => 'val ue1'
        };
...