2013-02-27 68 views
0

我试图从多个记录中解析出一些信息。我感兴趣的项目之一可以在一个字符串中有多个条目。我的想法只是返回所有匹配值的数组,但是我遇到了结果问题。例如:红宝石匹配和扫描不匹配的模式相同的方式?

> 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="[^"]+') 
=> [] 

无论如何,为什么匹配,呃,匹配和扫描不?

回答

2

String#match将其参数转换为正则表达式,String#scan搜索文字字符串,如果这就是您给它的值,给#scan一个正则表达式给它相同的匹配。参考ri文档进行String#匹配和String#扫描。尝试在IRB如下:

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

扫描也将继续匹配整个字符串,而匹配停在第一图案(然后你可以给它一个开始偏移继续,如果你需要)。

+0

啊,匹配将字符串转换为正则表达式,扫描不会。所以你必须使用//作为扫描中的定界符,如果你想它将正则表达式解释为正则表达式。知道了谢谢! – jearl 2013-02-27 20:07:17