0

スキャン結果の要素から割り当てられた文字列から文字を正規表現しようとしています。一致を使用しようとしていますが、変数が配列であると不平を言っています。trashなぜ " " が配列と見なされているのか、私は混乱しています。

test = 'class="date">B=oddTu Q='
array = test.scan(/([A-Z])=/)
puts array
trash = array.last
trash.to_s
puts trash
if /Q/.match(trash)
  puts $1
end

そして、これは私が見ている結果です

C:\Ruby>scratch.rb
class="date">B=oddTu Q=
B
Q
Q
C:/Ruby/scratch.rb:14:in match: can't convert Array to String (TypeError)
        from C:/Ruby/scratch.rb:14:in `<main>'

編集: scan は配列の配列を返すため、trash = array.last を実行すると、trash は 1 レベルから 1 配列に取り除かれます。Trash = Trash[0] を実行すると、文字列になります。

4

2 に答える 2

2

問題は、trash(単一要素「Q」の) 配列であることです。シリーズ化するとわかります。

私のirbから取られたこれらの2行を見てください:

test.scan(/([A-Z])=/)
=> [["B"], ["Q"]]

スキャンは配列の配列を返します - それぞれが各グループの値に一致します。

配列でマッチングを行うことはできません。

于 2012-12-13T12:54:40.063 に答える
1

ボリスが指摘しているように、配列の配列を取得しています。これは、正規表現 (括弧で囲まれた式) にグループがあるためです。このようなグループが複数ある場合、それぞれが返される配列内の要素に対応します。

test.scan(/([A-Z])(=)/)
# => [["B", "="], ["Q", "="]]

あなたの場合、これを回避する方法がいくつかあります。単純flattenに配列にすることができます:

test.scan(/([A-Z])=/).flatten
# => ["B", "Q"]

または、関心のあるビットをグループ化する代わりに、肯定的な先読みを使用できます。

test.scan(/[A-Z](?==)/)
# => ["B", "Q"]

残念ながら、興味のない部分は=符号なので、先読み構文では少し奇妙に見える(?=pattern)ため、flattenオプションの方が明確かもしれません。

于 2012-12-13T14:33:40.487 に答える