0

複数のレコードからいくつかの情報を解析しようとしています。私が興味を持っている項目の 1 つは、文字列に複数のエントリを持つことができます。私の考えは、一致するすべての値の配列を返すことだけでしたが、結果に問題があります。例えば:

> s = '>ctg7180000000043_1204 selected_feature: CDS loc=299156..299605;/db_xref="GO:0007155";/db_xref="GO:0009289";'
 => ">ctg7180000000043_1204 selected_feature: CDS loc=299156..299605;/db_xref=\"GO:0007155\";/db_xref=\"GO:0009289\";"
> s.match('db_xref="[^"]+')
 => #<MatchData "db_xref=\"GO:0007155">
> s.scan('db_xref="[^"]+')
 => []

とにかく、なぜマッチ、えー、マッチ、スキャンはしないのですか?

4

1 に答える 1

3

String#match引数を Regexp に変換しString#scan、リテラル文字列が指定されている場合はそれを検索し、 #scan に Regexp を指定すると、同じ一致が得られます。String#match と String#scan の ri ドキュメントを参照してください。irb で次のことを試してください。

regex = /db_xref="[^"]+/
s.match(regex)
=> #<MatchData "db_xref=\"GO:0007155">
s.scan(regex)
=> ["db_xref=\"GO:0007155", "db_xref=\"GO:0009289"]

また、スキャンは文字列全体にわたって一致を継続しますが、一致は最初のパターンで停止します (その後、必要に応じて開始オフセットを指定して続行できます)。

于 2013-02-27T19:35:43.647 に答える