停止扫描分裂我的比赛

时间:2015-07-30 05:20:16

标签: ruby regex

当我扫描zan时,我将整个群组放在一个条目中,这是我期望和想要的行为:

"ax zan".scan /(zan)/ #=> [["zan"]] 

我怎样才能让整场比赛回归,空白区域全部?即

"ax       b".scan /.../ #=> [["ax       b"]]

当我扫描(ax)\s*(b)时,匹配将分为两个条目:

"ax b".scan /(ax)\s*(b)/ #=> [["ax", "b"]]

更新

如何在没有群组的情况下使用|运算符?

"sab   x".scan /sab|p\s*x/ #=> [["sab   x"]]
"sap   x".scan /sab|p\s*x/ #=> [["sap   x"]]

2 个答案:

答案 0 :(得分:2)

只需删除捕获组。

"ax       b".scan(/ax\s*b/)

要将元素放入另一个数组中,请将上述正则表达式放在捕获组中。

"ax       b".scan(/(ax\s*b)/)
  

"ax b".scan /(ax)\s*(b)/ #=> [["ax", "b"]],我得到了两个结果?

因为默认情况下扫描会为组提供第一个首选项。如果没有组,则考虑匹配。在上面,捕获组存在于正则表达式中,捕获axb,因此您在数组中获得了这两个元素。请注意,如果您有任何单个捕获组,则输出格式必须是二维数组。

示例:

irb(main):001:0> "ax       b".scan(/ax\s*b/)
=> ["ax       b"]
irb(main):002:0> "ax       b".scan(/(ax\s*b)/)
=> [["ax       b"]]

答案 1 :(得分:2)

正如您所发现的,当您使用带有组的RegExp时,String#scan将返回一个数组数组,每个内部数组每个捕获都有一个元素。如果这不是您想要的,那么您必须使用?:标记使您的论坛非捕获,例如(?:foo|bar)

expr = /sa(?:b|p)\s*x/
"sab   x".scan(expr) #=> ["sab   x"]
"sap   x".scan(expr) #=> ["sap   x"]

P.S。上面的工作,但由于只有一个字符不同,在这种情况下,你应该使用一个字符类:

/sa[bp]\s*x/

P.P.S。如果您正在寻找多个匹配项,则应该只使用scan。如果您只想要一个匹配项,请使用String#slice,它具有方便的String#[]别名。这会将匹配作为字符串而不是数组返回:

expr = /sa(?:b|p)\s*x/
"sab   x"[expr] #=> "sab   x"
"sap   x"[expr] #=> "sap   x"

如果不清楚,这也适用于变量,就像任何其他方法一样:

str = "sab   x"
str[/sa[bp]\s*x/] #=> "sab   x"