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=""
中的第一个逗号,即 a
和 b
之间的逗号。然后它会尝试找到 ,g
之后存在的 =""
,以便您获得实际结果。
你想要的是:,[^=]+?="",?
匹配 1 个或多个在 =""
之前不是等号的任何字符,你将得到 a,b="cde",g="hi"
作为结果。
我有一个带有非贪婪修饰符的正则表达式,但似乎不起作用。我已经尝试了很多正则表达式的变体和我能想到的其他各种方法,但都没有成功,以至于我失去了理智
我想删除下面字符串 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=""
中的第一个逗号,即 a
和 b
之间的逗号。然后它会尝试找到 ,g
之后存在的 =""
,以便您获得实际结果。
你想要的是:,[^=]+?="",?
匹配 1 个或多个在 =""
之前不是等号的任何字符,你将得到 a,b="cde",g="hi"
作为结果。