Ruby .scan方法使用regex返回空

所以给了一个像这样的字符串"\"turkey AND ham\" NOT \"roast beef\""我需要得到一个内部字符串的数组如下: ["turkey AND ham", "roast beef"]并消除OR和,而NOT那些可能会或可能不会存在。

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

返回以下2组:

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

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

我看了这个和其他 SOpost,还有其他几个,但无法弄清楚我哪里出错了

这是我的rails控制台的结果:

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

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

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

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

所以,如果你在你的正则表达式中删除\\

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

这将返回一个2d数组

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

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

如果你想要一个简单的数组,你可以在数组上运行flatten方法。

当与scan使用的正则表达式包含捕获组(@ davidhu2000的方法)时,通常可以使用外观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的文档中详述的那样,有四种外观(正面和负面的外观和前瞻)。 有时它们被视为“零宽度”匹配,因为它们不是匹配文本的一部分。