我有以下字符串:
"ft-2 MY AWESOME ft-12 APP"
"MY AWESOME APP"
"MY AWESOME APP ft-20"
我想对ft-<NUMBER>
零件以外的单词进行一些修改(在这种情况下为标题化)。ft-<NUMBER>
Word可以在任何地方出现。它可以多次出现,也可能根本不存在。弦操作后,最终结果应该看起来像:
"ft-2 My Awesome ft-12 App"
"My Awesome App"
"My Awesome App ft-20"
是否可以在Ruby中写下任何可以进行此转换的正则表达式?
我尝试过这样的尝试:
"ft-4 MY AWESOME ft-5 APP".gsub(/(?<=ft-ds).*/) { |s| s.titleize }
我得到了这个: ft-4 My Awesome Ft 5 App
。
R = /
[[:alpha:]]+ # match one or more uppercase or lowercase letters
(?=s|z) # match a whitespace or end of string (positive lookahead)
/x # free-spacing regex definition mode
def doit(str)
str.gsub(R) { |s| s.capitalize }
end
doit "ft-2 MY AWESOME ft-12 APP"
#=> "ft-2 My Awesome ft-12 App"
doit "MY AWESOME APP"
#=> "My Awesome App"
doit "MY AWESOME APP ft-20"
#=> "My Awesome App ft-20"
您的 (?<=ft-ds).*
模式与ft-<digits><whitespace>
之前的任何位置匹配,然后匹配您titleize
的任何0 字符。
您需要匹配不以ft-<NUMBER>
模式开头的整个单词。然后,您需要的只是降低比赛并大写:
s.gsub(/b(?!ft-d)p{L}+/) { | m | m.capitalize }
或,如果您喜欢使用$1
变量,请添加一个捕获组:
s.gsub(/b(?!ft-d)(p{L}+)/) { $1.capitalize }
请参阅Ruby Demo
模式详细信息:
-
b
-首先,在字母之前断言位置(因为下一个消耗模式是与字母相匹配的p{L}
) -
(?!ft-d)
-如果接下来的2个字母是ft
,则会使匹配失败,而-
和digit -
(p{L}+)
-匹配1 字母的捕获组(后来在替换块中使用$1
提及)
capitalize
"返回str的副本,其第一个字符转换为大写,其余为小写" 。
我不是100%确定您想要的东西
我的一个项目中有类似的东西
#lib/core_ext/string.rb
class String
def my_titleize
humanize.gsub(/b('?[a-z])/) { $1.capitalize }
end
end
人性化(options = {})公共资本化第一个单词,转 强调空间,如果存在,则剥离尾随的" _id"。喜欢 标题为,这是为了创建漂亮的输出。
可以通过设置第一个单词的大写字母 可选参数大写为false。默认情况下,此参数为 true。