私は以下を行い、期待される出力を得ることができますadmin1secretpw
。複数の正規表現バッファをRubyの変数に保存しますか?
Rubyでどうやったらいいですか?私。複数のバッファを変数に保存します。
#!/usr/bin/perl
my $a = 'admin1:[email protected]';
(my $u = $1, my $p = $2) if $a =~ /(.*?):(.*?)@/;
print $u;
print $p;
私は以下を行い、期待される出力を得ることができますadmin1secretpw
。複数の正規表現バッファをRubyの変数に保存しますか?
Rubyでどうやったらいいですか?私。複数のバッファを変数に保存します。
#!/usr/bin/perl
my $a = 'admin1:[email protected]';
(my $u = $1, my $p = $2) if $a =~ /(.*?):(.*?)@/;
print $u;
print $p;
名前付きキャプチャグループを使用できます。
a = 'admin1:[email protected]'
/(?<username>.*?):(?<password>.*?)@/ =~ a
puts username
puts password
これは両方のグループをローカル変数として取り込みます。
=~
への引数の順序は重要です。 ... =~ a
を使用すると、指定されたグループがローカル変数に割り当てられます。a =~ ...
を使用してはなりません。
私はあなたのコードをファイルにペイトすると、 ''
空のファイルで動作します。あなたのコードでは 'a'は文字列ではなくURLなので、あなたのコードには' ... =〜a.to_s'が必要でしょうか? – akuhn
私は参照してください。それはそれを解決しました=)あなたのノートについて '=〜'。コードスニペットが角括弧の中にないので、変数がどのようにローカルになることができるのかよく分かりません。 –
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 ...
)ステートメント改質条件またはループ構築物で修飾my
、state
、又はour
の動作は未定義あります。my
変数の値は、undef
、以前に割り当てられた値、またはそれ以外の値である可能性があります。それに頼らないでください。将来のバージョンのperlは、それを試してみるperlのバージョンとは何か異なることがあります。ここは龍です。
だから、あなたはPerlでそれをしたくありません。また、正規表現は
my ($u, $p) = $a =~ /(.*?):(.*?)@/;
無料で今すぐテスト
$u
と
$p
ことを示します。もしあなたが望むのであれば、同じ声明でそれを行うこともできます。
私は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
a
、u
とp
はローカル変数です。 @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を参照してください。
Perlの知識が質問に答える必要がないような方法で質問することができますか?私がPerlを知らないにもかかわらず、あなたがしようとしていることを知っているかもしれないと思うので、Perl以外の言葉であなたの質問を述べるのはそれほど難しくないと思います。 –