2012-05-15 21 views
1

所以我知道如何找到一个字的关键字就好:如何在Ruby中为多个单词/短语编写正则表达式?

text =~ /keyword1|keyword2|keyword3/i 

可是我怎么找词组?例如。 “天空是蓝色的......但有时会变成橙色。”

我试着这样做:

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

,但没有奏效。

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

+0

你的期望输入和期望输出到底是什么? – Cade

+0

我的预期输入是至少2个单词的短语到许多倍数,其中我会选择符合我的正则表达式的特定规则的短语(即,我有我正在寻找的特定短语 - 就像上面关于天空)。重要的是能够查看一串随机数的单词(用空格分隔,甚至是多个空格),并检测我的正则表达式中是否有一个短语出现。 – marcamillion

+0

请注意,a)parens是不必要的,b)您可以使用['Regexp.union'](http://www.ruby-doc.org/core-1.9.3/Regexp.html#)生成文字正则表达式交替方法-c-union):'Regexp.union(“foo bar”,“jim jam”,“yay”)#=>/foo \ bar | jim \ jam | yay /' – Phrogz

回答

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是“truthy”,nil在Ruby中是“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 

这有帮助吗?

+0

Hrmmmm ....似乎我可能已经胖了这一块。我的正则表达式结尾处有一个尾部管道'|',所以它返回了很多误报。但是,现在它似乎工作正常。你是对的。谢谢! – marcamillion

+0

没问题。请参阅@Phrogz关于如何提高您的正则表达式的优秀评论。 :) – Cade

3

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

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

所以你的意思是:'text =〜/(\ ssky \ sis \ sblue)|(orange \ ssky)/ i'? – marcamillion

+0

是的,如果没有选项卡或换行符号而不是空格。 – shift66

+0

或者可能'/ s + sky \ s +是\ s + blue /'以允许多个空格字符。 – Phrogz

相关问题