Ruby 非贪婪修饰符不适用?

Ruby non-greedy modifier did not apply?

我有一个带有非贪婪修饰符的正则表达式,但似乎不起作用。我已经尝试了很多正则表达式的变体和我能想到的其他各种方法,但都没有成功,以至于我失去了理智

我想删除下面字符串 s 中嵌入的所有空字符串。使用我的正则表达式,我希望删除所有匹配 something=""

的东西
s = 'a,b="cde",f="",g="hi",j=""'

puts s; puts s.gsub( /,.+?="",?/ , "," ).chomp(','); nil

预计:

a,b="cde",g="hi"

我得到的:

a,g="hi"

为什么下面 gsub 正则表达式中的 .+? 不是非贪婪的?

如果我将 . 限制为一组字符 [\w\d_-],它会起作用,但这迫使我做假设:

puts s; puts s.gsub( /,[\w\d_-]+?=""/ , "" ).chomp(','); nil

# outputs:
a,b="cde",f="",g="hi",j=""
a,g="hi"

如果我进行某种否定查找,它也有效:

puts s; puts s.gsub( /,.+?="",?/ , "," ).chomp(','); nil

# outputs:
a,b="cde",f="",g="hi",j=""
a,g="hi"

但我仍然不明白为什么它在第一种情况下不起作用。

正则表达式从左到右匹配。您的正则表达式 ,.+?="",? 匹配字符串 a,b="cde",f="",g="hi",j="" 中的第一个逗号,即 ab 之间的逗号。然后它会尝试找到 ,g 之后存在的 ="",以便您获得实际结果。

你想要的是:,[^=]+?="",? 匹配 1 个或多个在 ="" 之前不是等号的任何字符,你将得到 a,b="cde",g="hi" 作为结果。