一行中捕获组出现的最小次数的正则表达式

问题描述 投票:0回答:1

我有一个文本文件,其中每行由一系列数字组成,数字之间用空格分隔,后跟一个单词。这些数字仅包含数字 1 到 6,并且每个数字中的数字都是有序且唯一的。文件末尾的单词并不重要。

例如:

2356 345 12345 4 4 1 6 gripped
12346 2 2346 123456 2356 56 245 12346 13456 12456 misidentifies
1256 345 24 12456 12356 123456 12356 356 1256 5 26 swine

我的文件中的所有行都是有效的。

我需要编写一个

grep
命令,它使用正则表达式来匹配至少包含 8 个数字(其中包含 1 或 6)的所有行。这意味着行
346 1245 136 23456 5 1356 123456 5 123456 123456 octettes
是一个匹配项 (346, 1245, 136, 23456 、 1356、 123456、 123456、 123456 是 8 个数字),但
1 236 145 23 16 4 12356 4 3 packers
行不匹配(1、 236、 145、 16、 12356 只是 5 个数字)。

注意:正则表达式不必匹配整行。 grep 返回某处存在匹配项的所有行,因此唯一重要的部分是至少有 8 个匹配项。

我构建了这个正则表达式:

((?:(?:123456)|(?:1[2-5]*)|(?:[2-5]*6)) )
它匹配所有符合条件的数字,并且不会对 123456 进行两次计数。我现在的问题是计算出现的次数。如果所有数字匹配都一个接一个,则 {8,} 就足够了,但有时匹配之间有一个(或多个)数字(例如 134 4 245 1245)。

我尝试了很多方法,包括将

[2-5]{0,5}
[2-5]*
.*
放入要重复的匹配组中(使用 {8,}),但似乎没有任何效果。它们要么不正确匹配,要么给出灾难性的回溯错误。

我对正则表达式还很陌生,所以我可能误解了某些事情的工作原理。我知道我需要修改我的捕获组才能使我的 {8,} 量词正常工作,但我不知道如何操作。

Regex101 链接包含更多示例和我当前(部分)解决方案此处

regex grep
1个回答
0
投票

你可能会使用

^(?: *[1-6]+){8}

正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.