odr*_*037 1 javascript ruby arrays loops replace
鉴于:
check_for = ["Lorem", "ipsum", "dolor", "sit", "amet"]
replace_with = ["Donec", "ut", "libero", "sed", "arcu"]
sentence = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur."
Run Code Online (Sandbox Code Playgroud)
如果它包含放在数组'check_for'中的单词并且如果找到它们,则如何检查'句子'中的整个字符串,用'replace_with'中的单词替换?
check_for中的单词可以替换为replace_with中具有相同索引的单词:
check_for [idx]应替换为replace_with [idx]
我使用嵌套循环使用Javascript做了类似的事情.出于某种原因,这不适用于Ruby.
我对嵌套循环的想法是将句子分成数组并使用带有i和j的while循环.句子[i]从0开始:
sentence[i] == check_for[j]
Run Code Online (Sandbox Code Playgroud)
然后:
sentence[i] = replace_with[j]
Run Code Online (Sandbox Code Playgroud)
除了这个想法不起作用,我确信在Ruby中有一个更直接的方式.
不区分大小写是可以的.
这可以通过定义替换的哈希来完成:
sentence = "Lorem ipsum dolor sit amet, consectetur adipiscing elit..."
replacements = {
'Lorem' => 'Donec',
'ipsum' => 'ut',
'dolor' => 'libero',
'sit' => 'sed',
'amet' => 'arcu',
}
sentence.gsub(Regexp.union(replacements.keys), replacements)
#=> "Donec ut libero sed arcu, consectetur adipiscing elit..."
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您可以轻松地replacements从您的数组生成该哈希,如下所示:
replacements = Hash[check_for.zip(replace_with)]
Run Code Online (Sandbox Code Playgroud)
Cary Swoveland建议使用简化的Regexp:
sentence.gsub(/\w+/, replacements)
Run Code Online (Sandbox Code Playgroud)
我真的很喜欢它,因为它读得更好.
我想知道rexexp是否会对性能产生影响:一方面是构建一个复杂但专门的正则表达式.另一方面使用简单的正则表达式,但必须检查每个单词与哈希.
require 'benchmark'
def simple
@sentence.gsub(/\w+/, @replacements)
end
def union
@sentence.gsub(Regexp.union(@replacements.keys), @replacements)
end
n = 100_000
Benchmark.bmbm(15) do |x|
x.report("simple :") { n.times do; simple; end }
x.report("union :") { n.times do; union ; end }
end
# Rehearsal ---------------------------------------------------
# simple : 4.790000 0.010000 4.800000 ( 4.804576)
# union : 3.820000 0.020000 3.840000 ( 3.846012)
# ------------------------------------------ total: 8.640000sec
Run Code Online (Sandbox Code Playgroud)
事实证明,较长的版本更快一点.但我很确定可能会根据sentence要替换的元素的长度和数量而改变.
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |