Ruby .scan方法使用正则表达式返回空

时间:2016-10-13 17:24:35

标签: ruby-on-rails ruby regex

因此,给定一个像"\"turkey AND ham\" NOT \"roast beef\""这样的字符串,我需要得到一个包含内部字符串的数组,如下所示:["turkey AND ham", "roast beef"]并消除OR' s,AND&{39}和NOT可能存在或不存在。

Rubular的帮助下,我提出了这个正则表达式/\\["']([^"']*)\\["']/

返回以下两组:

Match 1 1. turkey AND ham Match 2 1. roast beef

然而,当我使用.scan继续获取并清空数组时。

我查看了thisthis other SO帖子以及其他一些帖子,但无法弄清楚我哪里出错了

以下是我的rails控制台的结果:

=> q = "\"turkey and ham\" OR \"roast beef\"" => q.scan(/\\["']([^"']*)\\["']/) => []

期望: ["turkey AND ham", "roast beef"]

我还要提到我吮吸正则表达式。

2 个答案:

答案 0 :(得分:3)

当与scan一起使用的正则表达式包含捕获组(@ davidhu2000' s方法)时,通常可以使用外观 1 。这只是个人偏好的问题。要允许包含单引号或(转义)双引号字符串的双引号字符串,可以使用以下正则表达式。

r = /
    (?<=") # match a double quote in a positive lookbehind
    [^"]+  # match one or more characters that are not double-quotes
    (?=")  # match a double quote in a positive lookahead
    |      # or
    (?<=') # match a single quote in a positive lookbehind
    [^']+  # match one or more characters that are not single-quotes
    (?=')  # match a single quote in a positive lookahead
    /x    # free-spacing regex definition mode

"\"turkey AND ham\" NOT 'roast beef'".scan(r)
  #=> ["turkey AND ham", "roast beef"]

作为'"turkey AND ham" NOT "roast beef"' #=> "\"turkey AND ham\" NOT \"roast beef\""(即,如何保存单引号字符串),我们不必担心这是另外一个需要处理的案例。

1对于仍然认为正则表达式是黑魔法的观众中的任何一种,在Regexp的文档中详细阐述了四种外观(正面和负面的外观和前瞻)。有时它们被视为&#34;零宽度&#34;匹配,因为它们不是匹配文本的一部分。

答案 1 :(得分:2)

你的正则表达式试图匹配\,它不匹配字符串中的任何内容,因为\存在以逃避双引号,并且不会成为字符串的一部分。

因此,如果您删除正则表达式中的\\

res = q.scan(/["']([^"']*)["']/)

这将返回一个二维数组

res = [["turkey and ham"], ["roast beef"]]

每个内部数组都是正则表达式中的所有匹配组,因此如果正则表达式中有两个捕获组,则会在内部数组中看到两个项目。

如果需要简单数组,可以在数组上运行flatten方法。