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的文档中详述的那样,有四种外观(正面和负面的外观和前瞻)。 有时它们被视为“零宽度”匹配,因为它们不是匹配文本的一部分。