我一直试图匹配3到5之间的0出现
所以我的目标是匹配所有包含3到5 0的字符串。
到目前为止,我有
egrep '[0]{3,5}' *.txt
预期产量
20001 [有效]
200134 [无效]
20103040 [有效]
203004038002 [无效]
但是这将输出仅具有连续零的字符串。
如何修改代码,使其也与不必要的连续零匹配?
答案 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