当我扫描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"]]
答案 0 :(得分:2)
只需删除捕获组。
"ax b".scan(/ax\s*b/)
要将元素放入另一个数组中,请将上述正则表达式放在捕获组中。
"ax b".scan(/(ax\s*b)/)
"ax b".scan /(ax)\s*(b)/ #=> [["ax", "b"]]
,我得到了两个结果?
因为默认情况下扫描会为组提供第一个首选项。如果没有组,则考虑匹配。在上面,捕获组存在于正则表达式中,捕获ax
,b
,因此您在数组中获得了这两个元素。请注意,如果您有任何单个捕获组,则输出格式必须是二维数组。
示例:强>
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"