複数の文字列から同じ部分を抜き出す方法

[code]

    text_1 = 'hogeあいうえお'
    text_2 = 'hogeかきくけこ'
    text_3 = 'hogeさしすせそ'
    
    期待値 => 'hoge'
    
[/code]

* * *
[code]

    text_1 = 'hogeあいうえお'
    text_2 = 'hogeあいうえおかきくけこ'
    text_3 = 'hogeあいうさしすせそ'
    
    期待値 => 'hogeあいう'
    
[/code]

「前方の一致部分」に限ります。

これをrubyで実現したいのですがどうしたらよいのか全くわかりません。  
わかる方いましたらお願いします。




`differ`というライブラリを使うのが簡単です。

[code]

    $ gem install differ
    
[/code]

[code]

    require 'differ'
    
    def diff(strs)
      strs.reduce do |s1, s2|
        s = Differ.diff_by_char(s1,s2).to_s
        s[0..s.index('{')-1]
      end
    end
    
    list1 = ['hogeあいうえお','hogeかきくけこ','hogeさしすせそ']
    list2 = ['hogeあいうえお','hogeあいうえおかきくけこ','hogeあいうさしすせそ']
    
    
    puts diff(list1) # hoge
    puts diff(list2) # hogeあいう
    
[/code]

簡単に解説すると、`Differ.diff_by_char()`というメソッドは以下のように２つの文字列を文字単位で比較し、差分を返します。

[code]

    require 'differ'
    
    puts Differ.diff_by_char('abc','abd').to_s
    # ab{"d" >> "c"}
    
    puts Differ.diff_by_char('ab','abc').to_s
    # ab{-"c"}
    
[/code]

そのため、比較対象の文字列に`{`が入っていないことを前提とすると、差分のうち`{`が現れる前までの文字列を前方一致箇所とみなすことができます。

### 追記:

以下のように書き直すと、対象文字列に`{`が含まれていた場合でも正確に対応できます。

[code]

    require 'differ'
    
    def diff(strs)
      strs.reduce do |s1, s2|
        diff = Differ.diff_by_char(s1,s2)
        raw = diff.send(:raw_array)
        (raw[0].is_a? String)? raw[0]: ''
      end
    end
    
    list1 = ['hoge{あいうえお','hoge{かきくけこ','hoge{さしすせそ']
    list2 = ['hogeあいうえお','hogeあいうえおかきくけこ','hogeあいうさしすせそ']
    
    
    puts diff(list1) # hoge{
    puts diff(list2) # hogeあいう
    
[/code]

