1

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

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' 

或类似的。

谢谢!

4

2 回答 2

1

我不完全确定你想做什么,但我在正则表达式中提出了这个:

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

这将匹配一个状态,其间有任意数量的位置块。

希望有帮助,本

更新

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

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

于 2013-04-01T09:07:08.703 回答
1

这是应该为您工作的正则表达式:

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

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

于 2013-04-01T09:51:22.720 回答