如何在Ruby中拆分字符串?

时间:2010-10-27 10:55:50

标签: ruby regex string split

我有像name1="value1" name2='value2'这样的特殊字符串。值可以包含空格,并由单引号或双引号分隔。名称永远不会包含空格。名称/值对由空格分隔。

我想将它们解析为像这样的名称 - 值对列表

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

如果Ruby理解了外观断言,我可以通过

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

但是Ruby不理解外观断言,所以我有点卡住了。

但是,我确信无论如何都有更优雅的方法来解决这个问题,所以我转向你。你有解决这个问题的好主意吗?

5 个答案:

答案 0 :(得分:6)

这就像'喜欢'她所说的那样的值失败了,但它可能已经足够了。

str = %q(name1="value1" name2='value 2')
p Hash[ *str.chop.split( /' |" |='|="/ ) ]
#=> {"name1"=>"value1", "name2"=>"value 2"}

答案 1 :(得分:2)

这不是一个完整的答案,但Oniguruma,1.9中的标准regexp库支持外观断言。如果您使用的是Ruby 1.8.x,它可以作为gem安装。

那说,并且正如Sorpigal评论的那样,我不会使用正则表达式,而是倾向于一次遍历字符串一个字符,跟踪你是否在名字部分,当你到达当您在报价范围内并达到匹配的收盘价时,等号。在达到结束报价时,您可以将名称和值放入哈希值并继续下一个条目。

答案 2 :(得分:1)

class String

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

end

答案 3 :(得分:1)

这应该为你做。

 class SpecialString
   def self.parse(string)
     string.split.map{|s| s.split("=") }.inject({}) {|h, a| h[a[0]] = a[1].gsub(/"|'/, ""); h }
   end
 end

答案 4 :(得分:0)

试试:/[='"] ?/

我不知道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'
        };