3

ここに投稿している非常に具体的な問題についてお詫びしますが、この問題に遭遇する可能性のある他の人にも役立つことを願っています。次のようにフォーマットされている文字列があります。

[[,action1,,],[action2],[]]

これを有効なYAMLに変換して、次のように解析できるようにします。

[['','acton1','',''],['action2'],['']]

私はこれを達成するためにたくさんの正規表現を試しましたが、私は完全に途方に暮れているのではないかと心配しています。必要に応じて、複数の式を実行しても問題ありません。例(ルビー):

puts s.gsub!(/,/,"','")  # => [[','action1','',']','[action2]','[]]
puts s.gsub!(/\[',/, "['',") # => [['','action1','',']','[action2]','[]]

それはそこに到達していますが、私はこのアプローチでネズミの穴を下り始めているような気がします。これを達成するためのより良い方法はありますか?

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

4

3 に答える 3

4

これは空のフィールド(ruby1.9)の仕事をします:

s.gsub(/(?<=[\[,])(?=[,\]])/, "''")

または、ゼロ幅後読みをサポートしないruby1.8の場合:

s.gsub(/([\[,])(?=[,\]])/, "\\1''")

空でないフィールドの引用は、次のいずれかを使用して実行できます。

s.gsub(/(?<=[\[,])\b|\b(?=[,\]])/, "'")
s.gsub(/(\w+)/, "'\\1'")

上記では、ゼロ幅のポジティブルックビハインドとゼロ幅のポジティブルックアヘッドアサーション('(?<='および'(?='))を使用しています。

ルビー特有のドキュメントを探しましたが、特にこれらの機能を説明するものは見つかりませんでした。代わりに、 perlreを紹介させてください。

于 2009-08-20T02:47:59.360 に答える
3

解析してから有効なYAMLを出力する方が簡単です。


私はRubyを知らないので、これがPerlの例です。


JSONに似ているように見えるYAMLのサブセットのみが必要なので、JSONモジュールを使用しました。

言い訳をしたかったRegexp::Grammarsので、それを使ってデータを解析しました。

アレイの深さに関係なく、動作することを保証します。

#! /usr/bin/env perl
use strict;
#use warnings;
use 5.010;
#use YAML;
use JSON;
use Regexp::Grammars;


my $str = '[[,action1,,],[action2],[],[,],[,[],]]';

my $parser = qr{
  <match=Array>

  <token: Text>
    [^,\[\]]*

  <token: Element>
  (?:
    <.Text>
  |
    <MATCH=Array>
  )

  <token: Array>
  \[
     (?:
       (?{ $MATCH = [qw'']; })
     |
       <[MATCH=Element]>   ** (,)
     )
  \]
}x;


if( $str =~ $parser ){
  say to_json $/{match};
}else{
  die $@ if $@;
}

どの出力。

[["","action1","",""],["action2"],[],["",""],["",[],""]]

本当にYAMLが必要な場合は、コメントを外して「use YAML;」に置き換えto_json()てください。Dump()

---
-
  - ''
  - action1
  - ''
  - ''
-
  - action2
- []
-
  - ''
  - ''
-
  - ''
  - []
  - ''
于 2009-08-20T05:39:36.973 に答える
1

これを試して:

s.gsub(/([\[,])(?=[,\]])/, "\\1''")
 .gsub(/([\[,])(?=[^'\[])|([^\]'])(?=[,\]])/, "\\+'");

編集:置換構文についてはよくわかりません。これは、最初のグループ#1であり、2番目のgsubグループで最も番号の高い参加グループであると想定されています$+

于 2009-08-20T03:19:04.147 に答える