4

Ruby 2.0 の正規表現での名前付きキャプチャに問題があります。文字列変数と補間された正規表現があります。

str = "hello world"
re = /\w+/
/(?<greeting>#{re})/ =~ str
greeting

次の例外が発生します。

prova.rb:4: <main>': undefined local variable or methodmain:Object (NameError)
シェルの挨拶で 1 が返されました

ただし、補間式は名前付きキャプチャがなくても機能します。例えば:

/(#{re})/ =~ str
$1
# => "hello"
4

3 に答える 3

6

名前付きキャプチャはリテラルを使用する必要があります

Ruby の正規表現ライブラリのいくつかの制限に直面しています。Regexp#=~メソッドは、名前付きキャプチャを次のように制限します。

  • 正規表現がリテラルでない場合、代入は発生しません。
  • 正規表現補間#{}も割り当てを無効にします。
  • 正規表現が右側にある場合、代入は発生しません。

正規表現で名前付きキャプチャまたは補間が必要かどうかを決定する必要があります。現在、両方を持つことはできません。

于 2013-04-08T23:32:14.967 に答える
2

の結果を割り当て#matchます。これは、名前付きキャプチャ グループを検索できるハッシュとしてアクセスできます。

> matches = "hello world".match(/(?<greeting>\w+)/)
=> #<MatchData "hello" greeting:"hello">
> matches[:greeting]
=> "hello"

または、#matchマッチ結果を受け取るブロックを指定します。

> "hello world".match(/(?<greeting>\w+)/) {|matches| matches[:greeting] }
=> "hello"
于 2013-04-08T23:23:02.723 に答える