我坚持使用我想做的正则表达式搜索。假设以下列表(请注意新行):
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'
或类似。
谢谢!
答案 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]+))