Ruby 将字符串转换为下划线,避免在结果字符串中使用“/”
Ruby Convert string into undescore, avoid the "/" in the resulting string
我有一个名字间隔 class..
"CommonCar::RedTrunk"
我需要将其转换为带下划线的字符串"common_car_red_trunk"
,但是当我使用
"CommonCar::RedTrunk".underscore
,我得到的是 "common_car/red_trunk"
。
是否有其他方法可以完成我的需要?
解决方案:
"CommonCar::RedTrunk".gsub(':', '').underscore
或:
"CommonCar::RedTrunk".sub('::', '').underscore
或:
"CommonCar::RedTrunk".tr(':', '').underscore
替补:
或者将其中任何一个翻转过来,然后先执行 underscore()
,然后使用任何您想用的方法将“/”替换为“_”。
解释:
虽然所有这些方法看起来基本相同,但存在可能非常有影响力的细微差别。
简而言之:
gsub()
– 使用正则表达式进行模式匹配,因此,它会找到任何出现的 ":"
并将其替换为 ""
.
sub()
– 使用正则表达式进行模式匹配,与 gsub()
类似,不同之处在于它仅查找第一次出现([= 中的“g” 14=] 意思是“全球”)。这就是为什么在使用那个方法的时候,必须使用"::"
,否则就剩下一个":"
了。请记住此方法,它仅适用于单嵌套命名空间。意思是 "CommonCar::RedTrunk::BigWheels"
会被转换为 "CommonCarRedTrunk::BigWheels"
.
tr()
– 使用字符串参数作为单个字符替换数组。在这种情况下,因为我们只替换单个字符,所以它的工作方式与 gsub()
相同。但是,如果您想用“EX”替换“on”,例如,gsub("on", "EX")
会产生 "CommEXCar::RedTrunk"
而 tr("on", "EX")
会产生 "CEmmEXCar::RedTruXk"
.
文档:
https://apidock.com/ruby/String/gsub
这是一个纯粹的Ruby解决方案。
r = /(?<=[a-z])(?=[A-Z])|::/
"CommonCar::RedTrunk".gsub(r, '_').downcase
#=> "common_car_red_trunk"
参见(第一种形式)String#gsub and String#downcase。
通过以自由间距模式:
编写正则表达式可以使其成为自文档
r = /
(?<=[a-z]) # assert that the previous character is lower-case
(?=[A-Z]) # assert that the following character is upper-case
| # or
:: # match '::'
/x # free-spacing regex definition mode
(?<=[a-z])
是积极的回顾; (?=[A-Z])
是 正向预测 。
请注意 /(?<=[a-z])(?=[A-Z])/
匹配空(“零宽度”)字符串。例如,r
匹配 'Common'
和 'Car'
之间的空字符串,因为它前面是小写字母,后面是大写字母。
我不知道 Rails 但我猜你可以写
"CommonCar::RedTrunk".delete(':').underscore
我有一个名字间隔 class..
"CommonCar::RedTrunk"
我需要将其转换为带下划线的字符串"common_car_red_trunk"
,但是当我使用
"CommonCar::RedTrunk".underscore
,我得到的是 "common_car/red_trunk"
。
是否有其他方法可以完成我的需要?
解决方案:
"CommonCar::RedTrunk".gsub(':', '').underscore
或:
"CommonCar::RedTrunk".sub('::', '').underscore
或:
"CommonCar::RedTrunk".tr(':', '').underscore
替补:
或者将其中任何一个翻转过来,然后先执行 underscore()
,然后使用任何您想用的方法将“/”替换为“_”。
解释:
虽然所有这些方法看起来基本相同,但存在可能非常有影响力的细微差别。
简而言之:
gsub()
– 使用正则表达式进行模式匹配,因此,它会找到任何出现的":"
并将其替换为""
.sub()
– 使用正则表达式进行模式匹配,与gsub()
类似,不同之处在于它仅查找第一次出现([= 中的“g” 14=] 意思是“全球”)。这就是为什么在使用那个方法的时候,必须使用"::"
,否则就剩下一个":"
了。请记住此方法,它仅适用于单嵌套命名空间。意思是"CommonCar::RedTrunk::BigWheels"
会被转换为"CommonCarRedTrunk::BigWheels"
.tr()
– 使用字符串参数作为单个字符替换数组。在这种情况下,因为我们只替换单个字符,所以它的工作方式与gsub()
相同。但是,如果您想用“EX”替换“on”,例如,gsub("on", "EX")
会产生"CommEXCar::RedTrunk"
而tr("on", "EX")
会产生"CEmmEXCar::RedTruXk"
.
文档:
https://apidock.com/ruby/String/gsub
这是一个纯粹的Ruby解决方案。
r = /(?<=[a-z])(?=[A-Z])|::/
"CommonCar::RedTrunk".gsub(r, '_').downcase
#=> "common_car_red_trunk"
参见(第一种形式)String#gsub and String#downcase。
通过以自由间距模式:
编写正则表达式可以使其成为自文档r = /
(?<=[a-z]) # assert that the previous character is lower-case
(?=[A-Z]) # assert that the following character is upper-case
| # or
:: # match '::'
/x # free-spacing regex definition mode
(?<=[a-z])
是积极的回顾; (?=[A-Z])
是 正向预测 。
请注意 /(?<=[a-z])(?=[A-Z])/
匹配空(“零宽度”)字符串。例如,r
匹配 'Common'
和 'Car'
之间的空字符串,因为它前面是小写字母,后面是大写字母。
我不知道 Rails 但我猜你可以写
"CommonCar::RedTrunk".delete(':').underscore