用于电影标题和评级的Ruby正则表达式

时间:2013-07-21 22:22:24

标签: ruby regex

测验问题:

  

您将获得以下从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)。

     

以下哪个正则表达式可以实现此目的?检查所有适用的内容。

     
      
  1. regexp = /"([^"]+)",\s*"([^"]+)"/
  2.   
  3. regexp = /"(.*)",\s*"(.*)"/
  4.   
  5. regexp = /"(.*)", "(.*)"/
  6.   
  7. regexp = /(.*),\s*(.*)/
  8.   

有人会解释为什么答案是(1)和(2)?

1 个答案:

答案 0 :(得分:3)

  

有人会解释为什么答案是(1)和(2)?

结果字符串与"Aladdin", "G"类似,让我们来看看正确答案#1:

/"([^"]+)",\s*"([^"]+)"/
  1. "([^"]+)" =至少有一个字符 ""
  2. 包围
  3. , =逗号
  4. \s* =多个空格(包括0)
  5. "([^"]+)" =首先
  6. 这正是您将获得的字符串类型。我们来看看上面的字符串:

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

    现在让我们来看第二个正确答案:

    /"(.*)",\s*"(.*)"/
    
    1. "(.*)" = "所包围的almost any字符的任意数字(包括0)。
    2. , =逗号
    3. \s* =任意数量的空格(包括0)
    4. "(.*)" =见第一点
    5. 哪个是正确的以及以下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">  
      

      为了完整起见,我会告诉为什么第三和第四个也是错的:

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

      以上正则表达式是:

      1. "(.*)" = "所包围的几乎任何字符的任意数字(包括0)
      2. , =逗号
      3. =单个空格
      4. "(.*)" =见第一点
      5. 这是错误的,例如,Aladdin需要多个字符(第一个点),因为以下irb会话显示:

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

        第四个正则表达式是:

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

        是:

        1. (.*) =几乎任何字符的任意数字(包括0)
        2. , =逗号
        3. \s* =任意数量(包括0)的空格
        4. (.*) =见第一点
        5. 这是错误的,因为文本明确说明电影标题不包含任意数量的"字符,并且被双引号括起来。以上正则表达式不检查电影标题中是否存在"以及所需的周围双引号,接受","之类的字符串(无效)作为以下irb会话所示:

          '","'.match(/(.*),\s*(.*)/) # number 4
          # => #<MatchData "\",\"" 1:"\"" 2:"\"">