使用正则表达式拆分而不删除分隔符

时间:2014-02-17 22:37:20

标签: ruby-on-rails ruby regex

  

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 ROAD没有被接走。

知道怎么解决吗?

3 个答案:

答案 0 :(得分:2)

尝试使用这样的模式:

/\s+(?=\d)/

(?=…)这里是positive lookahead assertion。这将匹配一个或多个空格字符的任何序列,后面跟一个数字字符,但由于断言,数字将不是匹配字符串的一部分。

例如:

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

答案 1 :(得分: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+/仅表示“匹配一个或多个数字。”

答案 2 :(得分: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

如果您坚持, 可以<{1}}执行此操作:

scan

但是你要添加复杂性,要​​么撤消嵌套的子数组,要么在模式中添加以避免使用捕获。