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

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

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

可能有这样的字符串:

 Hello World Hello-world hello!! world 

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

 Search: "Hi pals!" Hi pals Hi! Pals! Hi-pals 

可能吗?

当然,你可以这样做:

 /hi.*?pals/i 

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

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

请注意它也匹配像“喜马拉雅好朋友”这样的字符串:

 Himalaya pals ^^ ^^^^ 

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

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

据推测,你不希望“嗨好朋友”匹配“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?"]