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

https://apidock.com/ruby/String/sub

https://apidock.com/ruby/String/tr

这是一个纯粹的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