【问题标题】:Ruby non-greedy modifier did not apply?Ruby 非贪婪修饰符不适用?
【发布时间】: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"

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

【问题讨论】:

标签: regex ruby regex-greedy


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 2014-03-30
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    相关资源
    最近更新 更多