正则表达式匹配字符串中的每个单词,无论空格或连字符?

时间:2011-07-31 09:39:29

标签: ruby regex

我认为这个问题可能很有趣,可以把它放在这里。

例如,我有一个搜索查询字符串,如:"hello world"

可能会有这样的字符串:

Hello World
Hello-world
hello!! world

你怎么能写一个动态匹配这些的表达式?如果表达式有效,它也应该适用于此:

Search: "Hi pals!"

Hi pals
Hi! Pals!
Hi-pals

有可能吗?

2 个答案:

答案 0 :(得分:3)

当然,你可以这样做:

/hi.*?pals/i

最后的尾随i启用不区分大小写的匹配,.*?匹配"hi""pals"之间的任何字符(换行符除外)。

Rubular演示:http://rubular.com/r/cwtbV2iTwy

请注意它也匹配像“Himalaya pals”这样的字符串:

Himalaya pals
^^       ^^^^

如果您不希望这种情况发生,请在混音中添加一些单词边界:

/\bhi\b.*?\bpals\b/i

答案 1 :(得分:2)

据推测,你不希望“hi pals”匹配“chi palsy”,对吗?好像你正试图找到与输入字符相同的字符串。如果是这样,这是一种方式:

class String
  def words
    scan(/\w+/).map(&:downcase)
  end
end

a = ["Hi pals", "Hi, pals", "hi-pals", "hi! ? pals?", "hipals", "himalaya pals"]
search = "hi pals"

a.select {|test| test.words == search.words}

=> ["Hi pals", "Hi, pals", "hi-pals", "hi! ? pals?"]