测验问题:
您将获得以下从Excel逗号分隔值(CSV)文件导出的电影的简短列表。每个条目都是一个字符串,其中包含双引号,零个或多个空格中的电影名称,以及双引号中的电影评级。例如,这是一个包含三个条目的列表:
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
您可以假设电影标题和评级从不包含双引号。在单个条目中,标题后面的逗号和评级的开头引号之间可能出现可变数量的空格(包括0)。
以下哪个正则表达式可以实现此目的?检查所有适用的内容。
- regexp =
/"([^"]+)",\s*"([^"]+)"/
- regexp =
/"(.*)",\s*"(.*)"/
- regexp =
/"(.*)", "(.*)"/
- regexp =
醇>/(.*),\s*(.*)/
有人会解释为什么答案是(1)和(2)?
答案 0 :(得分:3)
有人会解释为什么答案是(1)和(2)?
结果字符串与"Aladdin", "G"
类似,让我们来看看正确答案#1:
/"([^"]+)",\s*"([^"]+)"/
"([^"]+)"
=至少有一个字符不 "
被"
,
=逗号\s*
=多个空格(包括0)"([^"]+)"
=首先这正是您将获得的字符串类型。我们来看看上面的字符串:
"Aladdin", "G"
#^1 ^2^3^4
现在让我们来看第二个正确答案:
/"(.*)",\s*"(.*)"/
"(.*)"
= "
所包围的almost any字符的任意数字(包括0)。,
=逗号\s*
=任意数量的空格(包括0)"(.*)"
=见第一点哪个是正确的以及以下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">
为了完整起见,我会告诉为什么第三和第四个也是错的:
/"(.*)", "(.*)"/
以上正则表达式是:
"(.*)"
= "
所包围的几乎任何字符的任意数字(包括0),
=逗号
=单个空格"(.*)"
=见第一点这是错误的,例如,Aladdin
需要多个字符(第一个点),因为以下irb
会话显示:
'"Aladdin", "G"'.match(/"(.*)", "(.*)"/) # number 3
# => nil
第四个正则表达式是:
/(.*),\s*(.*)/
是:
(.*)
=几乎任何字符的任意数字(包括0),
=逗号\s*
=任意数量(包括0)的空格(.*)
=见第一点这是错误的,因为文本明确说明电影标题不包含任意数量的"
字符,并且被双引号括起来。以上正则表达式不检查电影标题中是否存在"
以及所需的周围双引号,接受","
之类的字符串(无效)作为以下irb
会话所示:
'","'.match(/(.*),\s*(.*)/) # number 4
# => #<MatchData "\",\"" 1:"\"" 2:"\"">