2015-12-28 62 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

謝謝大家。我完全錯過了邊界問題。 –

相關問題