使用gsub和块替换模式

时间:2017-01-13 01:13:08

标签: ruby regex

如果你有这样的字符串:

str = "john_1"
str = "joe_34"
str = "jack_54"

并且您希望获得下划线之前的所有字符,您可以使用split:

str.split("_")[0]
 => "john" 

您也可以使用匹配的组和\ 1 \ 2匹配器实现相同的目标:

str = "john_1"
str.gsub(/(.+)_.+/,'\1')

我试图更好地理解块中发生的事情。根据我的阅读,它将匹配的组替换为执行块的结果。但是,我不认为它的表现如此。

在下面的示例中,如果应该将匹配的组替换为块的结果:

str = "john_1"
str.gsub(/.+(_.+)/) {|m| ""}
 => "" 

那么为什么返回值为空字符串?结果应该是" john"因为只有下划线和所有后续字符匹配并替换为空字符串。我错过了什么?

1 个答案:

答案 0 :(得分:1)

gsub将所有出现的输入模式替换为块结果的值。 此处/.+(_.+)/将匹配整个字符串john_1,因此整个字符串将替换为""

如果您只想将_1部分与正则表达式匹配,可以使用正则表达式预测一种方法

str.gsub(/(?=.+)(_.+)/, "")