我是Ruby新手,总是用String.scan来搜索第一个出现的数字.奇怪的是,返回的值在嵌套数组中,但我只 Select [0][0]来获取我想要的值.(我确信它有它的用途,只是我还没有用过.)

我刚刚发现有一个String.match的方法.而且它似乎更方便,因为返回的数组不是嵌套的.

以下是两个示例,第一个是扫描:

>> 'a 1-night stay'.scan(/(a )?(\d*)[- ]night/i).to_a
=> [["a ", "1"]]

然后是比赛

>> 'a 1-night stay'.match(/(a )?(\d*)[- ]night/i).to_a
=> ["a 1-night", "a ", "1"]

我已经判断了API,但我不能真正区分差异,因为两者都提到"匹配模式".

出于好奇,这个问题是关于scan能做什么match不能做什么,反之亦然.任何只有一个人才能完成的特定场景?matchscan差吗?

推荐答案

简短回答:scan将返回所有匹配项.这并不意味着它优越,因为如果你只想要第一个匹配,str.match[2]读起来比str.scan[0][1]好得多.

ruby-1.9.2-p290 :002 > 'a 1-night stay, a 2-night stay'.scan(/(a )?(\d*)[- ]night/i).to_a
 => [["a ", "1"], ["a ", "2"]] 
ruby-1.9.2-p290 :004 > 'a 1-night stay, a 2-night stay'.match(/(a )?(\d*)[- ]night/i).to_a
 => ["a 1-night", "a ", "1"] 

Ruby相关问答推荐

为什么非数字在Ruby中被转换为integer?

根据部分已知值判断数组内容的简洁 Rubyist 方法是什么?

如何解密在 sjcl.js 中使用 ruby​​ 创建的 AES-256-GCM

Ruby 和用正则表达式分割字符串

将 pp 的结果(或输出到控制台的任何内容)放入字符串

如何替换 ruby​​ 中模式的每个实例?

我如何判断哪些模块已混合到一个类中?

Ruby 中的 Monad 类似功能

给url添加参数

由模块中定义的另一个覆盖方法

如何从 Ruby 中的线程返回值?

在 Ruby 早期转义 .each { } 迭代

如何用 Ruby 覆盖 shell 中的打印行?

如何在 Ruby 中使用 (n) 诅咒?

Ruby 2 中的命名参数

to_proc 方法是什么意思?

对哈希中数组的值求和

OpenSSL vs GPG 用于加密异地备份?

将字符串与Ruby中的数字连接起来

为什么 Ruby setter 需要self .班级内的资格?