Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在同一行中,将具有图案的线匹配n次_Regex_Vim_Sed_Awk_Grep - Fatal编程技术网

Regex 在同一行中,将具有图案的线匹配n次

Regex 在同一行中,将具有图案的线匹配n次,regex,vim,sed,awk,grep,Regex,Vim,Sed,Awk,Grep,我有一个文件,我需要过滤有(或没有)N个模式出现的行。 也就是说,如果我的模式是字母o,并且我要匹配字母o正好出现4次的行,则表达式应该匹配以下示例行中的第一行,而不是其他行: foo foo foo foo foo foo 我想我可以用vim中的正则表达式、sed、awk或任何其他工具来完成。 我在谷歌上搜索过,没有发现有人做过类似的事情。 可能需要编写一个脚本或类似的东西来解析每一行。 有人做过类似的事情吗 谢谢您可以使用下面这样的正则表达式: (?=(.*o){4})(?!

我有一个文件,我需要过滤有(或没有)N个模式出现的行。 也就是说,如果我的模式是字母
o
,并且我要匹配字母
o
正好出现4次的行,则表达式应该匹配以下示例行中的第一行,而不是其他行:

foo foo  
foo  
foo foo foo   
我想我可以用vim中的正则表达式、sed、awk或任何其他工具来完成。 我在谷歌上搜索过,没有发现有人做过类似的事情。 可能需要编写一个脚本或类似的东西来解析每一行。 有人做过类似的事情吗


谢谢

您可以使用下面这样的正则表达式:

(?=(.*o){4})(?!(.*o){5,}).*
Regexr-

这应该适用于您想要的任何模式。例如,要查找包含四个foo的行,请使用:

(?=(.*foo){4})(?!(.*foo){5,}).*

Regexr-

这是可能的,但并不容易

对于单字母大小写,诸如
^[^o]*o[^o]*o[^o]*o[^o]*o[^o]*o[^o]*$
之类的表达式可以使用。它基本上查找“noto”(零或更多),后跟“o”四次,并允许在末尾添加额外的“noto”字符

但是较长的表达式有点问题。例如,为了不找到单词“foo”,您必须允许“f”和“fo”,但不允许“foo”。因此,要找到一个正好有两个“foo”的行,必须允许行“ffofofofofofofofofo”,这不是很容易定义的

要匹配“除“foo”以外的任何内容”,可以使用表达式
([^f]|f[^o]|fo[^o])*
,该表达式允许使用“f”和“fo”以及其他内容,但不允许使用“foo”。但是你可以看到,如果单词较长,你必须匹配它四次,这会变得多么烦人。

在awk中

perl -lnwe '@c=$_=~/o/g;if(scalar(@c)==4){print $_}' file_to_parse
awk '{ if (gsub(/o/, "o") == 4) print }' # lines that matched
awk '{ if (gsub(/o/, "o") != 4) print }' # lines that didn't
如果您要使用不同的模式/匹配计数反复执行此操作,并且模式不是一个正则表达式,您还可以执行以下操作

awk -v pattern=o -v matches=4 '{ if (gsub(pattern, pattern) == matches) print }'
Perl单行程序:

perl -ne 'print if(tr/o/o/ == 4)' foo_file

如果你想写代码,那么你可以构造一个基于DFA的字符串匹配,或者我会告诉你看看移位或字符串匹配算法,你可以很容易地写出来。然后,您可以根据算法需要将字符串输入到适当的数据结构中。请阅读移位或字符串匹配算法。

我认为您的模式在
ooooo
中失败。我不熟悉此网站,我将查看它。顺便说一句-你在哪里看到结果?不起作用,坦率地说,太复杂了,不能不起作用-我认为你的答案是正确的,而不是蒂莫菲·斯托尔博夫的答案,因为你的答案较短。谢谢。我使用了M42中的perl答案,但您的答案也有效,所以我认为它很有用。谢谢。你的答案很好,但我认为M42答案是正确的,因为它比你的短。我认为你的建议很有用。谢谢。
grep-E-x'([^o]*o){4}[^o]*'