【发布时间】:2021-10-29 19:54:36
【问题描述】:
在以逗号分隔的整数列表中,我需要捕获(通过 PCRE 正则表达式)第一次出现的 12*(如果有)和第一次出现的 45*(如果有)。我怎么做? 我尝试了以下方法,但它只能捕获序列中的第一个数字:(
(?P<number>(?P<n12>12\d)|(?P<n45>45\d)|\d+)(?:,(?P>number))*
这是一个要测试的示例字符串:11,222,123,444,456,7。我希望在这里捕获 n12=123 和 n45=456。
UPD
作为一种解决方法,我自己的解决方案是将分隔符声明为可选(它不是),如下所示:
(?:,?(?P<number>(?P<n12>12\d)|(?P<n45>45\d)|\d+))*
- 这对我有用,但不是在所有情况下(例如 ,1234、123,4、1234 和 ,123,4 的解析方式相同),如果可能的话,我想避免这种情况。
UPD2
注意来吧,这不是我面临的真正任务——这只是一个简化的例子。这是另一个,以便您更好地理解我的想法:
(?P<animal>(?P<cat>pussy|cat)|(?P<dog>doge|dog)|\w+)(?:,(?P>animal))*
pussy,mouse,dog,bird - 必须捕获:cat=pussy, dog=dog
【问题讨论】:
-
如果你不使用全局标志,你可以寻找
\b12\d*和\b45\d*作为两个不同的查询。这对你来说是一个选择吗? -
或者可能没有命名组:
^.*?\b((12|45)\d*)(?:(?:,\d+)*?,(?!\2)((12|45)\d+))?并使用第一组和第三组。 -
@anubhava 上面的示例是我正在尝试做的尽可能简化的示例。在实际示例中(我不能在此处发布 b/c nda)子模式更复杂,但同样的事情仍然存在:我需要捕获不同子模式的单次出现(如果有),它们都是分隔符分隔列表中项目的更改- 这个列表只是解析数据的一部分,由几个部分组成
-
@JvdV 这只是一个例子。在实际情况下,我不希望复制子模式的代码(你做了)并一次性解析它们
-
@anubhava 有几个这样的子模式,我更愿意一次性捕获它们。我的解决方法允许我这样做,所以到目前为止,我坚持使用它,但如果可能的话,我正在寻找更好的解决方案
标签: regex pcre regex-group