2015-12-28 38 views
3

试图去匹配哈希字符失败,但成功的正则表达式的任何其他成员 。为什么这个正则表达式不能与Ruby一起工作

为什么这会失败?

感谢,

UNIT = [ 'floor', 'fl', '#', 'penthouse', 'mezzanine', 'basement', 'room' ] 

unit_regex = "\\b(" + UNIT.to_a.join("|") + ")\\b" 

unit_regexp = Regexp.new(unit_regex, Regexp::IGNORECASE) 

x=unit_regexp.match('#') 
+2

你真正的问题是什么“文字边界”的意思,它大致的意思是“一边是一个文字,一边是什么也不是一个非文字”,但'#'不是一个文字。我认为你必须在你的正则表达式中更加明确你想要匹配的东西。 –

回答

4

正如在评论中指出,您的问题是,\b是一个正则表达式中一个字边界(除非它是一个字符类中,感叹,在\b在与双引号字符串一样,/[\b]/是退格符)。字边界是大致

一侧并没有什么或对对方

#非单词字符单词字符不是单词字符所以/\b/不能匹配'#'所有和你的整个正则表达式无法匹配。

你将不得不更加明确你想要匹配什么。第一个刺将是“字符串或空格的开始”而不是第一个\b和“字符串或空白的结尾”而不是第二个\b。这可能是这样表示:

unit_regex = '(?<=\A|\s)(' + UNIT.to_a.join('|') + ')(?=\z|\s)' 

请注意,我已经切换到单引号,以避免所有的双重逸出麻烦。 ?<=是一个积极lookbehind,这意味着(\A|\s)需要在那里,但它不会被表达式匹配;同样,?=是一个正面看法。有关更多详细信息,请参阅the manual。还请注意,我们使用\A而不是^,因为^匹配行的开头而不是字符串;同样地,\z而不是$,因为\z字符串的末尾匹配,而$匹配的末尾。

您可能需要根据您的数据调整正则表达式,但希望这会让您开始。

+0

谢谢大家。我完全错过了边界问题。 –

相关问题