2009-05-22 3 views
11

私は、複数行の文字列を解析し、パターンの後に続く行を取得しようとしています。単一のキー/値の文字列を解析する "ルビーの方法"とは何ですか?

テキスト:

 
hello john 
your username is: jj 
thanks for signing up 

"ユーザー名は次のとおりです。" の後に私はすべて別名、JJを抽出したい

一つの方法:

text = "hello john\nyour username is: jj\nthanks for signing up\n" 
match = text[/your username is: (.*)/] 
value = $1 

しかし、これはperlのを思い出させます..私がルビーに言わなければならないほど自然に「読む」ことはありません。

クリーンな方法はありますか?名前: "ルビー"の方法ですか?

おかげ

+1

実際にRubyはPerlにかなり影響を受けていました。それはPerlと同じニッチに収まると思われていましたが、きれいでより規則的な素敵なオブジェクトシステムと構文がありました。 Perlのような機能のいくつかは現在廃止されていますが、実際にはRuby -p -i -eのようにPerlから数多くの機能を実際に持っています。 –

答えて

22

あなたのコードはかなりRubyの方法です。あなたはグローバル$1使用したくない場合は、2引数バージョンString#[]を使用することができます。これ以上Ruby'ishかどう

match = text[/your username is: (.*)/, 1] 
+0

ありがとうございました。それはまさに私が探していたものです!ドルのグローバル化はちょうど古い学校のようだった。 Ruby、Class:StringのAPIドキュメントを読んで読んでください。 http://www.ruby-doc.org/core/classes/String.html#M000786 – SWR

6

スプリットコマンドはmindbogglingly便利です。これは、文字列を部分文字列の配列に分割し、渡すものを分離します。引数を与えないと、空白で分割されます。ですから、あなたが探している単語は、第五、「言葉」(スペースやリターン文字の両方で分割)である知っていれば、あなたがこれを行うことができます:

テキスト=「こんにちはジョン\ Nyourのユーザー名は次のとおりです。JJ \ \ n」は
一致= text.splitをサインアップするためのnthanks [5]

..butおそらくそれは十分に自己文書ではありません、またはあなたはマルチワードマッチを可能にします。

正中= text.split( "\ n")を[1]
一致= midline.split( "ユーザ名は次のとおりです:").last

それとも代わりにこれを行うことができますこのより簡潔な方法:

一致=テキスト[/ユーザー名である:(。*)/、1]

+0

私はそれをしたいと思いますが、あなたのユーザー名ではなく ""で分割します: –

+1

+1は5番目の単語を得るためのsplitの面白い使い方のために気づいていませんでした。 –

+2

うわー、複数の攻撃経路に感謝します。;) 私は分割可能性に気づいていませんでしたが、着信テキストは静的ではありません(例は大幅に簡略化されています)ので、動作しません...しかし、問題を攻撃する良い方法でした。 – SWR

4

わからないが、別のオプション:

>> text = "hello john\nyour username is: jj\nthanks for signing up\n" 
>> text.match(/your username is: (.*)/)[1] 
=> "jj" 
+2

これが私のやり方です。それは技術的には[]ソリューションよりも優れているわけではありませんが、あなたがスキミングしているときにその意図が明確になっていると思います。 – Chuck

3

がありますRegexp#matchも返します。MatchDataオブジェクトがあります。このオブジェクトには、必要な情報がすべて含まれています。

irb> match = /your username is: (.*)/.match "hello john\nyour username is: jj\nthanks for signing up\n" 
#=> #<MatchData:0x557f94> 
irb> match.pre_match 
#=> "hello john\n" 
irb> match.post_match 
#=> "\nthanks for signing up\n" 
irb> match[0] 
#=> "your username is: jj" 
irb> match[1] 
#=> "jj" 
関連する問題