正则表达式-匹配不必要的连续出现

时间:2019-05-16 14:23:43

标签: regex unix grep

我一直试图匹配3到5之间的0出现

所以我的目标是匹配所有包含3到5 0的字符串。

到目前为止,我有

egrep '[0]{3,5}' *.txt
  
    

预期产量

  

20001 [有效]

200134 [无效]

20103040 [有效]

203004038002 [无效]

但是这将输出仅具有连续零的字符串。

如何修改代码,使其也与不必要的连续零匹配?

4 个答案:

答案 0 :(得分:1)

我想出了这个解决方案,它可以让您检查3-5个0,这些零可能被任何非0或空格包围。希望这会有所帮助:)

\b(?:[^0\s]*?0[^0\s]*?){3,5}\b

如果您仅检查数字字符串,且之间没有换行符或其他字符,则可以将\b换成^$,然后删除\ s并进行确保只有数字:

^(?:[1-9]*?0[1-9]*?){3,5}$

^匹配字符串的开头,$匹配字符串的结尾。

答案 1 :(得分:1)

输入文件:

cat file.txt
10203
1020304
102030405
10203040506
1020304050607

命令:

egrep '^([^0]*0){3,5}[^0]*$' file.txt
1020304
102030405
10203040506

说明:

^                   # beginning of line
    (               # start group
        [^0]*       # 0 or more non zero
        0           # 1 zero
    ){3,5}          # group must appear from 3 to 5 times
    [^0]*           # 0 or more non zero
$                   # end of line

答案 2 :(得分:0)

您要查找的正则表达式是:

^(?!(?:.*?0){6,})(?=(?:.*?0){3,})[0-9]+$

输入文件:

cat file.txt
20001
200134
20103040
203004038002

命令:

要使用正则表达式,我使用grep -P,因为(?!不支持环视符号egrep

grep -P '^(?!(?:.*?0){6,})(?=(?:.*?0){3,})[0-9]+$' file.txt
20001
20103040

说明::首先,我使用否定的超前查询来确保您不能在字符串的任何位置键入超过0的六个字符。之后,我使用正向前瞻来确保该字符串必须包含至少3个字符0

^是字符串的开头。 $是字符串的结尾。

答案 3 :(得分:0)

要匹配包含3-5个0的整数的ERE(如果需要的话)是^([1-9]*0){3,5}[1-9]*$,例如:

$ grep -E '^([1-9]*0){3,5}[1-9]*$' file
20001
20103040

此字符与@Toto's answer之间的区别在于,此字符将仅匹配整数,而@Totos将匹配介于它们之间的0个字符,例如:

$ echo '0 foo 0 bar 0' | grep -E '^([1-9]*0){3,5}[1-9]*$'
$ echo '0 foo 0 bar 0' | grep -E '^([^0]*0){3,5}[^0]*$'
0 foo 0 bar 0