在进行正则表达式拆分后如何保留我的第一个字符?

时间:2017-02-23 15:16:34

标签: ruby regex string split

我正在使用Rails 5.我正在尝试拆分正则表达式,但它似乎是在拆分后切断项目的第一个字符。我有

styles

我希望结果是

2.4.0 :044 >   tokens = ["12.BILL R. PRESTON"]
 => ["12.BILL R. PRESTON"] 
2.4.0 :045 > tokens = tokens.flat_map { |token| token =~ /\d\.[a-z]/i ? token.split(/\d\.[a-z]/i) : token } 
 => ["1", "ILL R. PRESTON"]

但“B”已被删除。如何调整我的分割表达式?

2 个答案:

答案 0 :(得分:1)

使用lookahead (?=[a-z]),以便在分组中不使用B

tokens.flat_map { |token| token =~ /\d\.[a-z]/i ? token.split(/\d\.(?=[a-z])/i) : token }
=> ["1", "BILL R. PRESTON"]

如果你想同时保留2B,你可以添加一个lookbehind (?<=\d)

tokens.flat_map { |token| token =~ /\d\.[a-z]/i ? token.split(/(?<=\d)\.(?=[a-z])/i) : token }
=> ["12", "BILL R. PRESTON"]

答案 1 :(得分:0)

tokens = ["12.BILL R. PRESTON", "238.BETTY Z. BOOP"]

tokens.map { |s| s.split(/(?<=\d)\d+\./) }
  #=> [["1", "BILL R. PRESTON"], ["2", "BETTY Z. BOOP"]] 

If you want all the digits split off, remove `\d+`:

tokens.map { |s| s.split(/(?<=\d)\./) }
  #=> [["12", "BILL R. PRESTON"], ["238", "BETTY Z. BOOP"]]