因此,给定一个像"\"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
继续获取并清空数组时。
我查看了this和this other SO帖子以及其他一些帖子,但无法弄清楚我哪里出错了
以下是我的rails控制台的结果:
=> q = "\"turkey and ham\" OR \"roast beef\""
=> q.scan(/\\["']([^"']*)\\["']/)
=> []
期望:
["turkey AND ham", "roast beef"]
我还要提到我吮吸正则表达式。
答案 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
方法。