我需要帮助查找部分单词匹配。它应该返回匹配三个连续字母的单词到目标。例如:Ruby部分单词匹配
WORDS = ["born", "port" ,"cort", "mort"]
find_match("corn", WORDS) => returns ["born", "cort"]
应找到部分匹配"corn"
。和“b orn”和“cor t”相匹配。
正则表达式可能不是解决此类问题的最佳选择。如果您有其他想法,请随时分享。
我需要帮助查找部分单词匹配。它应该返回匹配三个连续字母的单词到目标。例如:Ruby部分单词匹配
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
形式的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']
,其中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)}}
但这是有问题的,因为在WORDS
一个字可能会匹配w
的多个3个字符的子字符串,在这种情况下,每个匹配都会包含arr1
一次。
或'words.grep(re)' – Stefan
@Stefan:很好。我很多都忘记了'grep'。 –
谢谢,亩。这里有很多对我来说很新鲜的东西,再加上@ Stefan的关于grep的提醒。我不知道each_con或Regexp.union。很有用。我将不得不更深入地研究Regexp的方法。 –