REGEX:如何替换除单词/模式序列以外的所有字符



我有以下字符串:

"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。

最新更新