在Perl-RegExp中抑制大写字母超过3个的行

在Perl-RegExp中抑制大写字母超过3个的行,regex,perl,Regex,Perl,我需要创建一个Perl脚本,以抑制所有大写超过3个单词的行(每个单词用空格分隔) 现在,我删除了所有大写的句子,如下所示: while(my $text = <IN>) { $text =~ s/(^[A-Z \d\W]+$)\n//g; } while(我的$text=) { $text=~s/(^[A-Z\d\W]+$)\n//g; } 使用此模式 ^(?=(.*\b[A-Z]+\b){3}).*(\n|$) ^#字符串/行的开头 (?=#展望未来

我需要创建一个Perl脚本,以抑制所有大写超过3个单词的行(每个单词用空格分隔)

现在,我删除了所有大写的句子,如下所示:

  while(my $text = <IN>)
  {
    $text =~ s/(^[A-Z \d\W]+$)\n//g;
  }
while(我的$text=)
{
$text=~s/(^[A-Z\d\W]+$)\n//g;
}
使用此模式

^(?=(.*\b[A-Z]+\b){3}).*(\n|$)  

^#字符串/行的开头
(?=#展望未来
(#捕获组(1)
.#除换行符外的任何字符
*#(零或更多)(贪婪)
\b#
[A-Z]#字符类[A-Z]
+#(一个或多个)(贪婪)
\b#
)#捕获组结束(1)
{3} #(重复{3}次)
)#展望的结束
.               # 除换行符以外的任何字符
*#(零或更多)(贪婪)
(#捕获组(2)
\n#
|#或
$#字符串/行的结尾
)#捕获组结束(2)
利用此函数计算模式的匹配数

然后应用过滤器:

use strict;
use warnings;

while (<DATA>) {
    my $uc_words = () = /\b[A-Z]{2,}\b/g;
    print if $uc_words < 3;

}
__DATA__
FIRST lower SECOND
FIRST lower SECOND and THIRD and end
FIRST and SECOND and just an I, is that enough?
Filter me because of FIRST, SECOND, THIRD, and FOURTH.
Just First Letter Capitalized Is Cool, Right?

如果@{[$text=~/\b[A-Z]+\b/g]}>3,则下一步为
将+替换为
{2,}
。为什么不使用一些Perl代码,而不是尝试将整个程序压缩成正则表达式?在任何情况下,这都是错误的,因为它只检查字符串是否至少有三个全大写单词。我提供了一个正则表达式示例来匹配OP的要求,OP可以自由使用它,但他/她希望是否加载整个文件或循环每一行取决于他/她。但是对于你关于至少三个的评论,你是对的,我错过了它,很容易将我的模式修改为
^(?=(.*\b[A-Z]+\b){4})。*(\n |$)
use strict;
use warnings;

while (<DATA>) {
    my $uc_words = () = /\b[A-Z]{2,}\b/g;
    print if $uc_words < 3;

}
__DATA__
FIRST lower SECOND
FIRST lower SECOND and THIRD and end
FIRST and SECOND and just an I, is that enough?
Filter me because of FIRST, SECOND, THIRD, and FOURTH.
Just First Letter Capitalized Is Cool, Right?
FIRST lower SECOND
FIRST and SECOND and just an I, is that enough?
Just First Letter Capitalized Is Cool, Right?