[英]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.