2 捕获由不需要的字符分隔的第二个倍数捕获的组

2 Capturing groups with a multiples catch on the second that is separated by unwanted char

我正在尝试多次捕获跟随另一个或他自己的捕获组。我可以一遍又一遍地多次使用相同的字符串。我们就拿下面的来做测试吧:

 thing: random1_abcd
                abcd_n1p3; abcd_n2p1


"random2_abcd" does not exist.
 thing:  random3_abcd
                abcd_n1p1; abcd_n2p3

 thing: random4_abcd
                abcd_n1p3; abcd_n3p1; abcd_n2p7

 thing:  random5_abcd
                abcd_n4p2; abcd_n3p3; abcd_n6p7; abcd_n1p6

我想捕获 abcd_X foreach randomX_abcd(并知道它们之间的界限)。我不能抓住 "random2_abcd" 因为它不存在!

这是我目前所做的:(\w*_abcd) 是捕获 randomX_abcd。我得到 (abcd_\w*) 来捕获 abcd_X 部分。起初我试图抓住每一个 abcd_X 分开。所以我使用 (\w*_abcd)\s*(?: (abcd_\w*);?)+ 但它只捕获最后一个 abcd_X 因为它很贪婪。它不会在第二组中进行多次捕获。 Example

现在我试图只获取 2 个组(不再有相同捕获组的倍数匹配:一个具有 randomX_abcd,另一个具有相应的 abcd_X list。有一个棘手的部分:它可能有多个 spaces 和新行。但它可能只有一个 space。所以我可以不依赖于换行部分。 鉴于这个新想法,我想到了这个:

(\w*_abcd)\s*((?: ?abcd_\w*;?)+)

哪个工作正常,但我想知道。是否有可能实现我的第一个想法:用每个不同的 abcd_X 捕获相同的 randomX_abcd ?

不,不可能,因为正则表达式索引在匹配成功后会向右推进。您不能在字符串中的同一索引处多次匹配。