正则表达式匹配单词可选长度

时间:2018-04-03 17:04:17

标签: regex

我需要尽可能完整地匹配单词。有最小的“基础”,然后其他一切都是可选的。例如,基于“run”的单词“running”应该在“run,runn,runni,runnin,running”中匹配最长的

我想出了这个解决方案:/run(?:ning|nin|ni|n)?/,它有效,但它并不漂亮。

/run[ning]*/也有效,它很漂亮,但很模糊,可能有错误(runnnnning)。

是否可以使用条件:如果“run”后跟“n”,选择它,如果这个“n”后跟“i”选择它......?

1 个答案:

答案 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)