【问题标题】:What's the difference between scan and match on Ruby stringRuby字符串上的扫描和匹配有什么区别
【发布时间】:2011-12-21 01:48:04
【问题描述】:

我是 Ruby 新手,一直使用String.scan 来搜索第一次出现的数字。返回值在嵌套数组中有点奇怪,但我只是去[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 的劣势吗?

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    以前的答案表明 scan 将返回调用该方法的字符串中的每个匹配项,但这是不正确的。

    Scan 会跟踪索引并在前一个匹配的最后一个字符之后继续寻找后续匹配。

    string = 'xoxoxo'
    
    p string.scan('xo') # => ['xo' 'xo' 'xo' ]
    # so far so good but...
    
    p string.scan('xox') # => ['xox']
    # if this retured EVERY instance of 'xox' it would include a substring
    # starting at indices 0 and 2 but only one match is found
    

    【讨论】:

      【解决方案2】:

      简答: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"] 
      

      【讨论】:

      • 是搜索模式包含组的部分原因吗?因为对于简单的扫描str.scan(/\d+/),它非常简单。
      【解决方案3】:

      #scan 返回正则表达式匹配的所有内容。

      #match 将第一个匹配项作为 MatchData 对象返回,其中包含由特殊变量保存的数据,例如 $&(正则表达式匹配的内容;这就是映射到索引 0 的内容)、$1(匹配 1 ), $2, 等人。

      【讨论】:

        猜你喜欢
        • 2011-08-22
        • 1970-01-01
        • 2010-09-06
        • 2020-08-29
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 2018-12-01
        相关资源
        最近更新 更多