2016-12-23 8 views
4

私は以下を行い、期待される出力を得ることができますadmin1secretpw複数の正規表現バッファをRubyの変数に保存しますか?

Rubyでどうやったらいいですか?私。複数のバッファを変数に保存します。

#!/usr/bin/perl 

my $a = 'admin1:[email protected]'; 

(my $u = $1, my $p = $2) if $a =~ /(.*?):(.*?)@/; 

print $u; 
print $p; 
+1

Perlの知識が質問に答える必要がないような方法で質問することができますか?私がPerlを知らないにもかかわらず、あなたがしようとしていることを知っているかもしれないと思うので、Perl以外の言葉であなたの質問を述べるのはそれほど難しくないと思います。 –

答えて

3

名前付きキャプチャグループを使用できます。

a = 'admin1:[email protected]'  
/(?<username>.*?):(?<password>.*?)@/ =~ a 

puts username 
puts password 

これは両方のグループをローカル変数として取り込みます。

=~への引数の順序は重要です。 ... =~ aを使用すると、指定されたグループがローカル変数に割り当てられます。a =~ ...を使用してはなりません。

+0

私はあなたのコードをファイルにペイトすると、 ''

':URI :: GenericをString(TypeError) 'に暗黙的に変換することはありません。 –

+1

空のファイルで動作します。あなたのコードでは 'a'は文字列ではなくURLなので、あなたのコードには' ... =〜a.to_s'が必要でしょうか? – akuhn

+0

私は参照してください。それはそれを解決しました=)あなたのノートについて '=〜'。コードスニペットが角括弧の中にないので、変数がどのようにローカルになることができるのかよく分かりません。 –

3

Perlコードの重要な注意点については、最後をご覧ください。ルビーを使用すると、ここでString#match

u, v = a.match(/(.*?):(.*?)@/)[1,2] 

を行うことができます使用されています。 /.../を正規表現として再現し、Regexpオブジェクトに変換し、Regexp's matchメソッドを呼び出します。それは配列として機能するMatchDataオブジェクトを返します。 0でインデックスを付けると、一致する文字列全体が得られますが、1,2...は配列要素にアクセスします。

nilが一致しない場合は、それをテストできるように返されます。if u.nil?からNilClassまでです。

アン完全にクリーンな方法はMatchData#captures方法を使用

if matched = a.match(/(.*?):(.*?)@/) 
    u, v = matched.captures 
end 

であってもよいです。ブロック内に$1$2を使用することもできます。

外部データで正規表現を使ってシンボルを定義するコードでは、それらをテストする必要があることに注意してください。

Rubyでこれを行う方法は他にもあります。好奇心一例として、あなたはRegexpオブジェクトを作成し、そのmatchメソッドが呼び出され/.../ここ

u, v = (/(.*?):(.*?)@/).match(a)[1,2] 

を行うことができます。

これは文字列aを区切り文字として:又は@のいずれかを使用して分割されString#split

u, v = a.split(/:|@/)[0..1] 

を使用して、正規表現なしでうまくもを行うことができます。


質問は、クリアする必要がある方法でPerlコードで述べられています。

条件付きで宣言して割り当てようとしているようです。my $x = 1のようなステートメントは、2つの部分で実行されます。宣言はコンパイル時に発生し、割当ては実行時に実行されます。あるいは、その状態では、そうでないかもしれません。

したがって、割り当てがまったく発生しない場合、 ...どのような価値がありますか?

NOTE Statement Modifiers in perlsyn(元の強調)から:(例えば、my $x if ...)ステートメント改質条件またはループ構築物で修飾mystate、又はourの動作は未定義あります。 my変数の値は、undef、以前に割り当てられた値、またはそれ以外の値である可能性があります。それに頼らないでください。将来のバージョンのperlは、それを試してみるperlのバージョンとは何か異なることがあります。ここは龍です。

だから、あなたはPerlでそれをしたくありません。また、正規表現は

my ($u, $p) = $a =~ /(.*?):(.*?)@/; 

無料で今すぐテスト $u$pことを示します。もしあなたが望むのであれば、同じ声明でそれを行うこともできます。

+0

あなたは質問に答えていません。コメントにコメントを使用してください。 – akuhn

+2

@akuhn私は投稿する前に検討していましたが、このケースではその評価に同意しませんでした。彼らはPerlで潜在的に危険なものと同等のコードを要求しています。これは、目立つように提起される必要があります。それはコメントに収まりません。あなたの答えは_didではありません。 – zdim

+0

@ Jasmine Lognnesこの投稿をかなり更新しました。今すぐ直接質問にも答えます。あなたはあなたの答えを得ました。それは素晴らしいですが、これもまた見たいと思うかもしれません。 – zdim

0

私はPerlを知らないので、Rubyで以下のことをしたいと思っています。

a = 'admin1:[email protected]' 

a =~ /(.*?):(.*?)@/ 
($1 && $2) ? (u, v = $1, $2) : nil 
    #=> ["admin1", "secretpw"] 
u #=> "admin1" 
v #=> "secretpw" 

a = '[email protected]' 

a =~ /(.*?):(.*?)@/ 
($1 && $2) ? (u, v = $1, $2) : nil 
    #=> nil 

aupはローカル変数です。 @a@u@pグローバル変数だろうインスタンス変数$a$u$pだろう。

明らかに、正規表現が何をしているのかを知っているので、私はそのことについて何も言及する必要はありません。

ここでは、Rubyでこれを行う方法をいくつか紹介します。

a = 'admin1:[email protected]' 

rv = a.scan(/.+(?=:)|(?<=:).+?([email protected])/).flatten 
    #=> ["admin1", "secretpw"] 
rv.size == 2 ? (u, v = rv) : nil 
    #=> ["admin1", "secretpw"] 
u #=> "admin1" 
v #=> "secretpw" 

rv = a.split(/[:\@]/).take(2) 
    #=> ["admin1", "secretpw"] 
rv.size == 2 ? (u, v = rv) : nil 
    #=> ["admin1", "secretpw"] 

String#splitを参照してください。