3

クイズ問題:

Excel のコンマ区切り値 (CSV) ファイルからエクスポートされたムービーの次の短いリストが表示されます。各エントリは、二重引用符で囲まれた映画名、0 個以上のスペース、および二重引用符で囲まれた映画の評価を含む単一の文字列です。たとえば、次のリストには 3 つのエントリがあります。

movies = [
  %q{"Aladdin",  "G"},
  %q{"I, Robot", "PG-13"},
  %q{"Star Wars","PG"}
]

あなたの仕事は、このリストを解析するための正規表現を作成することです:

movies.each do |movie|
  movie.match(regexp)
  title,rating = $1,$2
end
# => for first entry, title should be Aladdin, rating should be G,
# => WITHOUT the double quotes

映画のタイトルと評価に二重引用符が含まれていないと思われるかもしれません。1 つのエントリ内で、タイトルの後のコンマと評価の開始引用符の間に可変数のスペース (0 を含む) が表示される場合があります。

これを実現する正規表現は次のうちどれですか? 当てはまるもの全てをご確認ください。

  1. 正規表現 =/"([^"]+)",\s*"([^"]+)"/
  2. 正規表現 =/"(.*)",\s*"(.*)"/
  3. 正規表現 =/"(.*)", "(.*)"/
  4. 正規表現 =/(.*),\s*(.*)/

答えが(1)と(2)である理由を誰か説明してくれませんか?

4

1 に答える 1

3

答えが(1)と(2)である理由を誰か説明してくれませんか?

結果の文字列は"Aladdin", "G"、正解 #1 を見てみましょう:

/"([^"]+)",\s*"([^"]+)"/
  1. "([^"]+)"= で囲まれていない少なくとも 1 文字""
  2. ,= コンマ
  3. \s*= スペースの数 (0 を含む)
  4. "([^"]+)"= 最初のように

これはまさにあなたが得る文字列のタイプです。上記の文字列を見てみましょう。

 "Aladdin",   "G"
#^1       ^2^3^4

では、2 番目の正解を見てみましょう。

/"(.*)",\s*"(.*)"/
  1. "(.*)"= で囲まれたほぼすべての文字の任意の数 (0 を含む) "
  2. ,= コンマ
  3. \s*= 任意の数のスペース (0 を含む)
  4. "(.*)"= 最初のポイントを参照

どちらが正しいか、次のirb セッション (Ruby 1.9.3 を使用) が示しています。

'"Aladdin",   "G"'.match(/"([^"]+)",\s*"([^"]+)"/) # number 1
# => #<MatchData "\"Aladdin\",   \"G\"" 1:"Aladdin" 2:"G">
'"Aladdin",   "G"'.match(/"(.*)",\s*"(.*)"/) # number 2
# => #<MatchData "\"Aladdin\",   \"G\"" 1:"Aladdin" 2:"G">  

完全を期すために、3 番目と 4 番目も間違っている理由を説明します。

/"(.*)", "(.*)"/

上記の正規表現は次のとおりです。

  1. "(.*)"= で囲まれたほぼすべての文字の任意の数 (0 を含む)"
  2. ,= コンマ
  3. = 1 つのスペース
  4. "(.*)"= 最初のポイントを参照

たとえば、次のセッションが示すAladdinように、複数の文字 (最初のポイント) を使用するため、これは間違っています。irb

'"Aladdin",   "G"'.match(/"(.*)", "(.*)"/) # number 3
# => nil 

4 番目の正規表現は次のとおりです。

/(.*),\s*(.*)/

つまり:

  1. (.*)= ほぼすべての文字の任意の数 (0 を含む)
  2. ,= コンマ
  3. \s*= 任意の数 (0 を含む) のスペース
  4. (.*)= 最初のポイントを参照

テキストには、映画のタイトルに文字が含まれておらず、"二重引用符で囲まれていることが明示されているため、これは間違っています。上記の正規表現は、次の セッションが示すように、(有効ではない) の"ような文字列を受け入れ、必要な二重引用符だけでなく、映画のタイトル内の存在もチェックしません。","irb

'","'.match(/(.*),\s*(.*)/) # number 4
# => #<MatchData "\",\"" 1:"\"" 2:"\""> 
于 2013-07-21T23:47:48.833 に答える