在给定目标

时间:2017-12-15 01:03:32

标签: ruby regex

鉴于我有一个类似(但不完全相同)的字符串:

"\ndigfodigjn \nfdoigoidfgj \nResidence\n123 N 74TH STREET \nPhiladelphia\nPA 19020\ngfhfgh gfhgfh \ndfijoij"

它将包含子字符串" Residence"。我想在那之后提取3个子串。每个都将由换行符分隔,但不保证整个字符串中的换行符总数。唯一的保证是在Residence子串之后,将有三个子串表示由换行符分隔的地址。

我想要这个:

123 N 74TH STREET Philadelphia PA 19020

我能够以这种方式获得Residence子串:

str.split("\n").detect {|s| s =~ /^Residence/ }

但是我怎样才能获得我想要的子串呢?

3 个答案:

答案 0 :(得分:0)

假设:

> s="\ndigfodigjn \nfdoigoidfgj \nResidence\n123 N 74TH STREET \nPhiladelphia\nPA 19020\ngfhfgh gfhgfh \ndfijoij"

您可以使用regex对多行字符串进行切片,然后捕获3行:

> s[/Residence\s*([^\n]*\n[^\n]*\n[^\n]*\n)/]
=> "Residence\n123 N 74TH STREET \nPhiladelphia\nPA 19020\n"

或者,如果您只想要捕获组部分:

> s[/Residence\s*([^\n]*\n[^\n]*\n[^\n]*\n)/,1]
=> "123 N 74TH STREET \nPhiladelphia\nPA 19020\n"

如果您需要三个字符串,则可以在"\n"上拆分。

答案 1 :(得分:0)

根据@dawg的回答,它可以解决问题:

s[/Residence(\n[^\n]+){3}/].split("\n")[1..3]

正则表达式将查找Residence然后它会查找3个换行符,其中包含任何非换行符。

结果字符串可以用新行分割,最后3个元素的地址为

答案 2 :(得分:0)

尝试使用回顾表达式:

> str[/(?<=Residence)(\n[^\n]+){3}/].split("\n").join
=> "123 N 74TH STREET PhiladelphiaPA 19020"