如何在Ruby中为多个单词/短语编写正则表达式?

时间:2012-05-15 14:39:06

标签: ruby regex

所以我知道如何找到一个单词关键字就好了:

text =~ /keyword1|keyword2|keyword3/i

但我如何找到短语?例如。 “天空是蓝色的......但有时会变成橙色。”

我尝试过:

text =~ /(the sky is blue)|(orange sky)|(sky is blue but orange)/i

但这没效果。

思考?基本上,我如何将由空格分隔的多个关键字串在一起,并能够找到与这些短语相对应的文本?

2 个答案:

答案 0 :(得分:3)

如果您不关心其他空格字符,请使用\s而不是空格。 但是,如果您需要匹配空格字符,则可以使用空格符号代码(\u0020):

text =~ /(the\u0020sky\u0020is\u0020blue)|(orange\u0020sky)|(sky\u0020is\u0020blue\u0020but\u0020orange)/i

答案 1 :(得分:3)

我不确定你的意思是“那不起作用”。 =~返回正则表达式找到匹配项的索引:

"The sky is blue....but sometimes it turns to orange." =~ /(the sky is blue)|(orange sky)|(sky is blue but orange)/i
# => 0

0是“天空是蓝色的”找到匹配的索引。如果未找到匹配项,则=~会返回nil0在Ruby中是“truthy”而nil是“falsey”,因此匹配的结果可以在if语句中使用。

如果这些是您正在寻找的确切短语,那么您现有的正则表达式应该可以正常运行。

"The sky is green....but sometimes it turns to orange sky." =~ /(the sky is blue)|(orange sky)|(sky is blue but orange)/i
# => 46

在运行正则表达式之前,您可以使用String#squeeze方法删除多个空格。

"The sky is green....but sky is blue      but orange sometimes.".squeeze!(" ") =~ /(the sky is blue)|(orange sky)|(sky is blue but orange)/i
# => 24

这有帮助吗?