我需要尽可能完整地匹配单词。有最小的“基础”,然后其他一切都是可选的。例如,基于“run”的单词“running”应该在“run,runn,runni,runnin,running”中匹配最长的
我想出了这个解决方案:/run(?:ning|nin|ni|n)?/
,它有效,但它并不漂亮。
/run[ning]*/
也有效,它很漂亮,但很模糊,可能有错误(runnnnning)。
是否可以使用条件:如果“run”后跟“n”,选择它,如果这个“n”后跟“i”选择它......?
答案 0 :(得分:1)
老实说,我认为您现有的解决方案是可以的;我怀疑你会找到一种让它更清晰的方法。我可以建议的唯一真正的替代方法是将其写为:
/run(?:n(?:n(?:i(?:n(?:g)?)?)?)?)?/
......但在我看来,这更令人困惑!
但是,您可以专注于编写辅助方法来抽象出这种复杂性。例如:
def partial_word_regex(word, min_length)
# e.g. ["ning", "ing", "ng", "g", ""]
extensions = 0.upto(word.length - min_length).map { |n| word[min_length..-n-1] }
# e.g. /run(?:ning|nin|ni|n|)/
/#{word[0..min_length-1]}(?:#{extensions.join('|')})/
end
# Usage:
partial_word_regex("running", 3)