代码之家  ›  专栏  ›  技术社区  ›  bastibe

如何用Ruby分割字符串?

  •  2
  • bastibe  · 技术社区  · 14 年前

    我有特殊的弦 name1="value1" name2='value2' . 值可以包含空格,并由单引号或双引号分隔。名字从不包含空格。名称/值对由空格分隔。

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

    如果Ruby理解lookaround断言,我可以通过

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

    但是Ruby不理解lookaround断言,所以我有些卡住了。

    不过,我相信有很多更优雅的方法来解决这个问题,所以我转向你。你有解决这个问题的好办法吗?

    5 回复  |  直到 14 年前
        1
  •  6
  •   steenslag    14 年前

    她说,这在“嗨”这样的价值观上是失败的,但可能已经足够好了。

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

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

    也就是说 Sorpigal 我已经注释过了,而不是使用regexp,我倾向于一次遍历字符串一个字符,跟踪您是否在名称部分,何时到达等号,何时在引号内,何时到达匹配的右引号。在到达右引号时,您可以将名称和值放入散列并继续下一个条目。

        3
  •  1
  •   jordinl    14 年前
    class String
    
      def magic_split
        str = self.gsub('"', '\'').gsub('\' ', '\'\, ').split('\, ').map{ |str| str.gsub("'", "").split("=") }
        Hash[str]
      end
    
    end
    
        4
  •  1
  •   Adam Tanner    14 年前

    这应该对你有用。

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

    尝试一下: /[='"] ?/

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