5

私は about_regular_expressions.rb を調べていますが、ここで何が起こっているのか正確にはわかりません:

def test_variables_can_also_be_used_to_access_captures
    assert_equal "Gray, James", "Name:  Gray, James"[/(\w+), (\w+)/]
    assert_equal "Gray", $1
    assert_equal "James", $2
end

正規表現で括弧を使用すると、フードの下に 2 つの新しい変数 ($1 と $2) が作成されるように思えます。

これは正しいです?

しかし、私はこれをしました:

def test_variables_can_also_be_used_to_access_captures
    assert_equal "Gray, James", "Name:  Gray, James"[/(\w+), (\w+)/]
    assert_equal "Smith, Bobert", "Name:  Smith, Bobert"[/(\w+), (\w+)/]
    assert_equal "Smith", $1
    assert_equal "Bobert", $2
end

そして「スミス」と「ボバート」を捕獲。括弧付きの新しい正規表現が使用されるたびに、以前の値が上書きされただけだと思いますか?

次に、単語を 1 つだけキャプチャしようとすると、次のようになります。

def test_variables_can_also_be_used_to_access_captures
    assert_equal "Gray, James", "Name:  Gray, James"[/(\w+), (\w+)/]
    assert_equal "Smith, Bobert", "Name:  Smith, Bobert"[/(\w+), (\w+)/]
    assert_equal "Smith", $1
    assert_equal "Bobert", $2
    assert_equal "Susan,", "Name:  Susan, whatever"[/(\w+),/]
    assert_equal "Susan", $1
    assert_equal nil, $2
end

$2 がなくなりました... ("Bobert" はもうありません)

ボンネットの下で何が起こっているかについて誰かが光を当てることができますか? または、私を正しい方向に向けますか?

4

2 に答える 2

5

あなたが正しいです。正規表現が一致するたびに、グローバル変数$~, $&, ..., $1, $2, ...が上書きされます。最後の例では、2番目の位置$2がないため、正規表現に一致するものがないため、に割り当てられました。(...)nil$2

複数の一致の結果をインターリーブで使用する場合、私が使用する手法は、一致データを変数として保持することです。つまり、最初の正規表現の一致の直後に、変数を割り当てますmatch1 = $~。次に、次の正規表現の一致に進み、を実行match2 = $~します。後で、これらの変数から一致した結果を抽出できます。たとえば、いくつかの正規表現の一致を行った後$1、最初の正規表現の一致で割り当てられた結果を参照したい場合はmatch1[1]、などで呼び出すことができます。

于 2012-10-18T01:36:36.470 に答える
0

これをチェックして:

"Name:  Gray, James"[0]    # => "N"
"Name:  Gray, James"[/w*/] # => "Name"

ルビーでは、文字列は、幅広いタイプのオブジェクト、および正規表現を受け入れるインデックスを介してアクセスできます。

言語リファレンスを見てください。

于 2012-10-18T01:37:45.417 に答える