正则表达式:通过换行捕获组

时间:2013-04-01 08:47:57

标签: regex

我坚持使用我想做的正则表达式搜索。假设以下列表(请注意新行):

Iowa

Big Store
5 Washington Blvd W.
555-123-456

Market 42
721 23th St. S
555-789-123


New York

Cool Café
23 5th Ave. 
123-456-789


Colorado

Pet Shop
1225 Hot St. N.
654-897-215

Discount Inn
25 Lincoln Rd.
456-987-321

Location 6
Address 6
Telephone 6

所以,我想我会首先使用\ n(换行符)来捕获状态,然后使用地址和电话号码来捕获所有以下位置。这是我最后一次工作的迭代:

(\n{3}(.*)(?:\n{2}(.*)\n{1}(.*)\n{1}(.*)))

这里的美景只捕获了每个州之后的所有状态和第一个位置,所以我认为“在非捕获组的末尾添加+应该获取其余的位置”。像这样:

(\n{3}(.*)(?:\n{2}(.*)\n{1}(.*)\n{1}(.*))+)

所在。它没有。它只是休息。

我做错了吗?如何捕捉状态之间的每个位置?

我的目标是将每个组收集到一个数组中,如:

locations[0][0][0] -> 'Big Store' 
locations[0][0][1] -> '5 Washington Blvd W.' 
locations[0][0][2] -> '555-123-456' 
...
locations[1][0][0] -> 'Cool Café' 
locations[1][0][1] -> '23 5th Ave.' 
locations[1][0][2] -> '123-456-789' 

或类似。

谢谢!

2 个答案:

答案 0 :(得分:1)

我不完全确定你想做什么,但我在regexpal中想出了这个:

(?:(?:^|\n{3})(.*))(?:(?!\n{3})(?:\n{2})(.*)\n(.*)\n(.*))+

这将匹配中间具有任意数量的位置块的状态。

希望有所帮助, 本

<强>更新

我再次更新了正则表达式以包含&amp;从捕获中排除某些组。分解它,你可以看到它匹配一行开头的状态或3个新行(?:(?:^|\n{3})(.*))之后的状态。然后是2个新行(但不是3个)中的一个或多个,后跟3个地址行。

但是,您应该注意,虽然此正则表达式与不同位置匹配,但它仅捕获最后一个(在某些实现中)。您可能需要进行一些多级匹配来捕获所有位置或使用@anubhava应答。

答案 1 :(得分:1)

这是适用于您的正则表达式:

([^\n]+)?(?:\n{2}([^\n]+)\n([^\n]+)\n([^\n]+))

现场演示:http://www.rubular.com/r/GISXu5S2vh