2

YAML ファイルの次のデータに基づいて、Ruby で正規表現を作成して、リストのそれぞれのグループ キーと項目キーに一致させることができますか?

ソースデータ

Groups:
    GroupA:
    - item 1
    - item 3
    Group B:
    - itemA
    - item 3
    C:
    - 1
    - item 3

テスト文字列:

GroupA item 1     
Group B itemA
c item 1
C 1
GroupA 1

予想される一致グループ

Match 1:
   1. GroupA
   2. item 1
Match 2:
   1. Group B
   2. itemA
Match 3:
   1. C
   2. 1

助けてくれてありがとう!

イアン

================================== 更新: Tin Mans のコメントに続いて -

ここでさらに背景を…

多数のメソッドを含むプラグイン内のクラスが存在します。各メソッドは、実行されるアクションを決定するために解析される文字列を受け取ります。一部のメソッドでは、文字列の内容が後続のアクションで使用されます。これが必要な場合は、文字列の関連部分を抽出 (または照合) するために正規表現が使用されます。残念ながら、このプロセスを変更するために上流のコードを制御することはできません。

この場合、文字列は「Group Item Status」の形式です。ただし、グループ名とアイテム名は必ずしも 1 つの単語である必要はなく、各グループにすべてのアイテムが含まれている必要はありません。例えば

"Group A Item 1"
"c item 1"
"GroupA 1"

したがって、必要なのは、入力文字列を解析してそれぞれの Group と Item を取得し、正しい値がさらに下のメソッドに渡されるようにするメソッドです。クラス内の他の同等のメソッドが正規表現を使用し、グループと項目のペアの決定的なリストを含む YAML ファイルがあることを考えると、正規表現が私の最初の考えでした。

しかし、私はより良いアプローチに対してオープンです

どうもありがとう

イアン

4

1 に答える 1

4

YAML ファイル内の何かを照合する必要があるのはなぜですか? YAMLパーサーを使用して Ruby にロードし、検索するか、メモリ内で変更します。

変更したファイルを保存したい場合、YAML パーサーは Ruby オブジェクトを YAML として出力できます。これを保存します。

require 'yaml'

yaml = '
---
Groups:
    GroupA:
    - item 1
    - item 3
    Group B:
    - itemA
    - item 3
    C:
    - 1
    - item 3
'

yaml = YAML.load(yaml)
# => {"Groups"=>{"GroupA"=>["item 1", "item 3"], "Group B"=>["itemA", "item 3"], "C"=>[1, "item 3"]}}

yaml['Groups']['GroupA'].first
# => "item 1"

yaml['Groups']['Group B'][1]
# => "item 3"

yaml['Groups']['C'].last
# => "item 3"

上記の定義に基づいて、データの操作は次のように行うことができます。

yaml = YAML.load(yaml)
groups = yaml['Groups']

new_group = {
  'groupa_first' => groups['GroupA'].first,
  'groupb_second' => groups['Group B'][1],
  'groupc_last' => groups['C'].last
}
yaml['New Group'] = new_group

puts yaml.to_yaml

どの出力:

---
Groups:
  GroupA:
  - item 1
  - item 3
  Group B:
  - itemA
  - item 3
  C:
  - 1
  - item 3
New Group:
  groupa_first: item 1
  groupb_second: item 3
  groupc_last: item 3

さまざまな言語すべてに対応する YAML パーサーがあるのには理由があります。データのロードと使用が簡単になります。そのツールを活用し、Ruby を使用してデータを変更し、必要に応じて再度書き出します。メモリ内で行うのは非常に簡単であることを考えると、ディスク上で変更しようと考える前に、1 つの巨大な YAML ファイルになるでしょう。

さて、問題は、正規表現を使用してハッシュのキーをどのように検索するかということです。

yaml['Groups'].select{ |k,v| k[/^Group/] }
# => {"GroupA"=>["item 1", "item 3"], "Group B"=>["itemA", "item 3"]}

必要なものを取得したら、その内容を簡単に変更し、メモリ内ハッシュに置き換えて、書き出すことができます。

于 2013-02-11T14:52:52.247 に答える