我需要帮助找到部分单词匹配。它应该将匹配三个连续字母的单词返回给目标。例如:
WORDS = ["born", "port" ,"cort", "mort"]
find_match("corn", WORDS) => returns ["born", "cort"]
应该找到"corn"
. 与“b orn ”、“ cor t”匹配。
正则表达式可能不是解决此类问题的最佳方法。如果您有其他想法,请随时分享。
我需要帮助找到部分单词匹配。它应该将匹配三个连续字母的单词返回给目标。例如:
WORDS = ["born", "port" ,"cort", "mort"]
find_match("corn", WORDS) => returns ["born", "cort"]
应该找到"corn"
. 与“b orn ”、“ cor t”匹配。
正则表达式可能不是解决此类问题的最佳方法。如果您有其他想法,请随时分享。
您可以使用each_cons
构建子字符串数组:
'corn'.chars.each_cons(3).map(&:join)
# ['cor', 'orn']
然后Regexp.union
将数组转换为单个正则表达式:
re = Regexp.union('corn'.chars.each_cons(3).map(&:join))
然后你可以匹配re
数组元素:
WORDS.select { |w| w =~ re }
概括:
def find_match(word, words)
re = Regexp.union(word.chars.each_cons(3).map(&:join))
words.select { |w| w =~ re }
end
我敢肯定这个一般主题有很多变化。例如,您可以使用match_str
of 形式String#[]
而不是正则表达式,我相信有很多不同的方法可以提取所有长度为 3 的子字符串。
非正则表达式解决方案:
WORDS = ["born", "port" ,"cort", "mort"]
def find_match(w)
threes = (0..w.size-3).reduce([]) {|arr, i| arr << w[i,3]}
WORDS.select {|w| threes.select {|s| w.include?(s)}.any?}
end
find_match("corn") # => ["born", "cort"]
find_match("cavort") # => ["port", "cort", "mort"]
find_match("heart") # => []
threes
,一个包含所有长度为 3 的子字符串的数组w
。如果w = snort
, 这将是, ['sno', 'nor', 'ort']
where和。w[0,3] = 'sno'
w[1,3] = 'nor'
w[2,3] = 'ort'
WORDS
其中具有至少与 中的一个字符串匹配的子字符串的单词threes
。当然,这有很多变体,例如:
threes = []; (threes << w[0,3]; w.slice!(0)) while w.size > 2
对于上面的第二行,我最初尝试过
threes.reduce([]) {|arr1, s| arr1 += WORDS.select {|w| w.include?(s)}}
但这是有问题的,因为 in 中的单词WORDS
可能匹配多个 3 字符的子字符串w
,在这种情况下,每次匹配都会包含arr1
一次。