为什么这个正则表达式不适用于Ruby

时间:2015-12-28 02:47:48

标签: ruby regex

尝试匹配哈希字符失败,但对任何其他成员都成功 正则表达式。

为什么这会失败?

谢谢,

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('#')

1 个答案:

答案 0 :(得分:4)

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

  

一边是单词字符,另一边没有字或非字字符

#不是单词字符,因此/\b/根本无法与'#'匹配,而且整个正则表达式无法匹配。

你必须更清楚地了解你想要匹配的东西。第一个stab将是“字符串或空格的开头”而不是第一个\b和“字符串或空格的结尾”而不是第二个\b。这可以这样表达:

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

请注意,我已切换到单引号以避免所有双重逃避麻烦。 ?<=是一个肯定的后瞻,这意味着(\A|\s)需要在那里,但它不会被表达式匹配;类似地,?=正向前瞻。有关详细信息,请参阅the manual。另请注意,我们使用\A而不是^,因为^匹配行的开头而不是字符串;同样,\z代替$,因为\z匹配字符串的结尾,而$匹配行的结尾

您可能需要根据您的数据调整正则表达式,但希望这可以帮助您入门。