如果你有这样的字符串:
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"因为只有下划线和所有后续字符匹配并替换为空字符串。我错过了什么?
答案 0 :(得分:1)
gsub
将所有出现的输入模式替换为块结果的值。
此处/.+(_.+)/
将匹配整个字符串john_1
,因此整个字符串将替换为""
如果您只想将_1
部分与正则表达式匹配,可以使用正则表达式预测一种方法
str.gsub(/(?=.+)(_.+)/, "")