繁体   English   中英

gsub 正则表达式仅在字符串开头或有空格时匹配

[英]gsub regex only match if beginning of string or has space

我有一堆缺少撇号的短语,并且我有一系列修复,如下所示:

phrase = "i d let some"

def contractions_to_fix
  [
    { missing: "let s", fixed: "let's" }, 
    { missing: "i d", fixed: "i'd" }
  ]
end

我正在尝试遍历收缩数组以替换它们,如下所示:

contractions_to_fix.each do |contraction|
  if phrase.include? contraction[:missing]
    idea_title.gsub! contraction[:missing], contraction[:fixed]
  end
end

对于这个例子,目标是返回"i'd let some" 但是,到目前为止,我尝试过的每个正则表达式都会返回不正确的响应。

例如:

  • contraction[:missing]导致"i'd let'some
  • /\bcontraction[:missing]\b/导致"id let some"

任何帮助将非常感激!

在标题中编写确切要求的最简单方法是翻转您的条件:“前面或后面没有非空格”:

idea_title.gsub!(/(?<!\S)#{Regexp.escape(contraction[:missing])}(?!\S)/, contraction[:fixed])

虽然/\b#{...}\b/应该适用于您给出的示例。 您的问题可能是您将String作为模式输入gsub! 而不是Regexp ,因此您实际上是在寻找\b (反斜杠和小写B ),而不是单词边界。 试试看

idea_title.gsub!(/\b#{Regexp.escape(contraction[:missing])}\b/, contraction[:fixed])
arr = [
  { missing: "let s", fixed: "let's" }, 
  { missing: "i d", fixed: "i'd" }
]
h = arr.reduce({}) { |h,g| h.merge(g[:missing]=>g[:fixed]) }
  #=> {"let s"=>"let's", "i d"=>"i'd"}

r = /\b(?:#{h.keys.join('|')})\b/
  #=> /\b(?:let s|i d)\b/

"i d want to let some".gsub(r, h)
  #=> "i'd want to let some"

这使用 String.gsub 的(第二种)形式,它将hash作为第二个参数并且没有块。

也可以如下计算h

h = arr.map { |g| g.values_at(:missing, :fixed) }.to_h
  #=> {"let s"=>"let's", "i d"=>"i'd"}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM