2016-07-26 8 views
2

My Railsアプリは、任意のデータをレコードに添付することを許可していないが、Markdownをサポートする説明領域を持つサードパーティのサービスからデータを取得しています。私は、マークダウンのコメントを経由して、記述内容の中の私のRailsアプリを介して各レコードのデータを渡すためにしようとしています:キーと値のペアのRegexマークダウン文字列

[//]: # (POST:28|USERS:102,78,90) 

... additional Markdown content. 

私はマークダウンのコメントを埋め込むためthis answer[//]: # (...)構文を見つけ、そして私の考えは、その後合格しましたパイプで区切られたキーと値のペアがコメントの内容として入ります。

上記の例を使用して、説明コンテンツ文字列を解析して、キーと値のペアを解釈できるようにしたいと考えています。この場合、POST=28USERS=102,78,90です。役立つ場合、このコメントは常にMarkdownコンテンツの最初の行に表示されます。

私はRegexがここに行く方法を想像していますか?私は本当に助けていただければ幸いです!

+0

あなたのアイデアは良いと思いますが、自分のartisanalシリアライズフォーマットを使用し、JSONのような何かの標準を '#'の後に使うことをお勧めします。マッチングと解析の両方を大幅に簡略化します。 –

答えて

0

あなたは\Gを使用することができます。

(?:^\[//\]:[^(]+\(\K # match your token [//]: at the beginning 
|      
\G(?!\A)\|   # or right after the previous match 
) 
(\w+):([\w,]+)  # capture word chars (=key) 
        # followed by : 
        # followed by word chars and comma (=val) 

a demo on regex101.comを参照してください。

+0

このタイプのRegexpはRuby環境で実行できますか?私は '〜'を使って正規表現を囲む方法がわかりません –

+0

@JodyHeavener:はい、ちょうど[**エスケープスラッシュ**](http://rubular.com/r/PxjfOnl1Hk) – Jan

0

あなたはこれを適切に解析するために2段階が必要になります:

最初のコメントを見つける:^\[\/\/\]: # \(([^)]*)\)

  • これは、コメントの内容をキャプチャします。

は、コンテンツを解析する:(グローバルフラグ付き)(\w+):([^|]+)

  • これは別々のキーと値を取り込みます。
+0

実際にこれを2つの別々のステップで行う理由はありません。 –

+0

ああ、私はあなたの答えからそれをやっている方法を参照してください。私はその機能を持っていないJS開発者です。かなりクール! – Whothehellisthat

0

上記の私のコメントで触れたように、#の後にJSONのような標準的なデータのシリアル化フォーマットを使用することで、多くのことを簡単にすることができます。たとえば:

require "json" 

MATCH_DATA_COMMENT = %r{(?<=^\[//\]: #).*} 

markdown = <<END 
[//]: # {"POST":28,"USERS":[102,78,90]} 

... additional Markdown content. 
END 

p JSON.parse(markdown[MATCH_DATA_COMMENT]) 
# => { "POST" => 28, "USERS" => [102, 78, 90] } 

正規表現%r{(?<=^\[//\]: #).*}は、以下の「[//]: #」何かを一致させる負の後読みを使用しています。

関連する問題