regex - 查找大写字母的运行

标签 regex perl

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

所以,例如,如果一行是

The QUICK Brown fox JUMPs OV3R T4E LAZY DoG.

然后我想提取 QUICKOV3R T4E LAZY .

这是我目前所拥有的:

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 

啊,结果

输入:

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 

关于regex - 查找大写字母的运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31255958/

相关文章:

javascript - 创建包含正则表达式匹配中所有组的数组的有效解决方案

ruby 正则表达式无法从 sql 中删除类名

mysql - DBI->connect 在终端中执行时有效,但在浏览器中执行时无效

perl - Perl 中二维数组的大小

perl - 在反引号中记录多个命令的 stdout 和 stderr

regex - 是否有可能找到具有反向引用的独占匹配项(在或组语句中)?

regex - 在两个字符串之间替换文本

python - 正则表达式匹配另一个特定术语之前或之后的术语

xml - 如何使用 Perl 的 XML::Twig 解析不完整的 XML 片段?

以 root 身份运行的 Perl 脚本(通用)