【发布时间】:2020-01-29 22:41:26
【问题描述】:
我有一个带有非贪婪修饰符的正则表达式,它似乎不起作用。我已经尝试了许多正则表达式的变体以及我能想到的各种其他方式,但没有成功,以至于我失去了理智
我想删除下面字符串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"
但我仍然不明白为什么它在第一种情况下不起作用。
【问题讨论】:
-
您可能认为
/,.+?="",?/的第一部分的意思是“匹配一个逗号后跟一个或多个除等号以外的字符”,但您不能停在那里,因为正则表达式要求等号后面必须紧跟两个双引号(然后可以选择一个逗号)。回想一下非贪婪匹配的含义:"By contrast, lazy matching makes the minimal amount of matches necessary for overall success."。我认为您可能忽略了“整体成功所必需的”。
标签: regex ruby regex-greedy