查找大写字母的排列



我有一个文件,其中包含一些全大写单词和一些混合大小写单词,我想提取全大写单词(包含在一行中(——也就是说,用b分隔的单词,至少包含两个大写字母,不包含小写字母。一切都是7位的。

例如,如果一条线路是

The QUICK Brown fox JUMPs OV3R T4E LAZY DoG.

那么我想要提取CCD_ 2和CCD_。

这就是我目前所拥有的:

while (<$fh>) { # file handle
    my @array = $_ =~ /b[^a-z]*[A-Z][^a-z]*[A-Z][^a-z]*b/;
    push @bigarray, @array;
}

有比[^a-z]*[A-Z][^a-z]*[A-Z][^a-z]*更优雅的方法吗?

似乎需要所有单词定义(构造w(字符
要找到并允许至少两个大写字母且不允许小写字母,您可能不会
绕过必须有选择地用大写字母包围的事实
和或数字或下划线。

还不如只配你需要的。

b[d_]*[A-Z]+[d_]*[A-Z]+[d_]*b

扩展:

 b 
 [d_]* 
 [A-Z]+ 
 [d_]* 
 [A-Z]+ 
 [d_]* 
 b 

ah,结果

输入:

The QUICK Brown fox JUMPs OV3R T4E LAZY DoG.  

输出:

 **  Grp 0 -  ( pos 4 , len 5 ) 
QUICK  
-----
 **  Grp 0 -  ( pos 26 , len 4 ) 
OV3R  
-----
 **  Grp 0 -  ( pos 31 , len 3 ) 
T4E  
-----
 **  Grp 0 -  ( pos 35 , len 4 ) 
LAZY  

更新-如果您想选择性地匹配由空格分隔的连续部分,
这是可行的。

 # (?&two_caps)(?:s+(?&two_caps))*(?(DEFINE)(?<two_caps>b[d_]*[A-Z]+[d_]*[A-Z]+[d_]*b))
 (?&two_caps) 
 (?:
      s+ (?&two_caps) 
 )*
 (?(DEFINE)
      (?<two_caps>
           b 
           [d_]* 
           [A-Z]+ 
           [d_]* 
           [A-Z]+ 
           [d_]* 
           b 
      )
 )

输出:

 **  Grp 0 -  ( pos 4 , len 5 ) 
QUICK  
 **  Grp 1 -  NULL 
---------
 **  Grp 0 -  ( pos 26 , len 13 ) 
OV3R T4E LAZY  
 **  Grp 1 -  NULL 

如果你真的想运行这些匹配,可以使用零宽度断言的split,然后过滤结果:

while (<DATA>) {
    for my $e (split (/(?<=b)([A-Z0-9_ ]+)(?=b)/)){
        $e =~ s/^s+|s+$//g;
        print "$en" unless ($e =~/^$/ or $e =~ /.*[a-z]/);
    }
}
__DATA__
The QUICK Brown fox JUMPs OV3R T4E LAZY DoG.

打印:

QUICK
OV3R T4E LAZY

那么这是怎么回事呢?

split将把符合您的标准的部分与不符合标准的部分分开:

use Data::Dumper;
while (<DATA>) {
    print Dumper split (/(?<=b)([A-Z0-9_ ]+)(?=b)/); 
}

打印:

$VAR1 = 'The';
$VAR2 = ' QUICK ';
$VAR3 = 'Brown';
$VAR4 = ' ';
$VAR5 = 'fox';
$VAR6 = ' ';
$VAR7 = 'JUMPs';
$VAR8 = ' OV3R T4E LAZY ';
$VAR9 = 'DoG.';

然后,循环在该数组上循环,从每个元素中去除空白,并测试小写字符或空行。

这会导致一条线为每条线生成您的阵列:

grep { $_ =~ /(?=[A-Z]{2,})^[^a-z]+$/ } map {s/^s+|s+$//g; $_} split (/(?<=b)([A-Z0-9_ ]+)(?=b)/);
b(?=S*[A-Z]S*[A-Z])[A-Z0-9]{2,}b

试试这个。请参阅演示。

https://regex101.com/r/cK4iV0/24

最新更新