2014-02-17 18 views
2
卸下的Delimeter

OWENS CROSS ROA 530 LYONS ROAD分割,而無需使用正則表達式

我需要上面的行分爲以下:

OWENS CROSS ROA 

530 LYONS ROAD 

的定界符數,即530

我需要讀取多達530,然後拆分爲:

OWENS CROSS ROA
530 LYONS ROAD

我嘗試:

address.text.split(/([0-9]+)/) 

輸出:

OWENS CROSS ROA 
530 

LYONS路不拾起。

任何想法如何解決它?

回答

2

嘗試使用模式是這樣的:

/\s+(?=\d)/ 

這裏的(?=…)positive lookahead assertion。這將匹配任何一個或多個空格字符序列,後面緊跟一個數字字符,但是由於聲明的原因,該數字不會是匹配字符串的一部分。

例如:

"OWENS CROSS ROA 530 LYONS ROAD".split(/\s+(?=\d)/) 
=> ["OWENS CROSS ROA", "530 LYONS ROAD"] 
+0

工作成功。你能解釋一下這個正則表達式嗎? – user311509

+0

@ user311509它被稱爲積極lookbehind您可以檢查文檔在http://www.ruby-doc.org/core-2.1.0/Regexp.html – bjhaid

+0

@bjhaid其實,這是一個向前看。 '(?<= ...)'是一個倒序。 –

0

只是爲了好玩,這裏是只使用一個基本的正則表達式和字符串指標的解決方案:「匹配一個或多個數字」

address_str = 'OWENS CROSS ROA 530 LYONS ROAD' 

# String index of digits in address_str 
number_location = address_str.index(/\d+/) 

address = [] 
address << address_str[0, number_location]  
address << address_str[number_location, address_str.length] 

/\d+/只是手段

0

這不是使用scan的好選擇。相反,我會用一個非常簡單的模式來捕捉你想要的部分:

pt1, pt2 = /^(.+?) (\d+.+)/.match('OWENS CROSS ROA 530 LYONS ROAD').captures 
puts pt1, pt2 
# >> OWENS CROSS ROA 
# >> 530 LYONS ROAD 

Rubular可以幫助你decipher it

可以scan做,如果你堅持:

'OWENS CROSS ROA 530 LYONS ROAD'.scan(/^(.+?) (\d+.+)/) 
# => [["OWENS CROSS ROA", "530 LYONS ROAD"]] 

,但你會增加複雜性,要​​麼撤消嵌套子陣列,或在模式避免使用捕捉。