我有一个包含一些全大写单词和一些混合大小写单词的文件,我想提取全大写单词(包含在一行中)——也就是说,用 \b
分隔的东西并且包含至少两个大写字母且没有小写字母。一切都是 7 位的。
所以,例如,如果一行是
The QUICK Brown fox JUMPs OV3R T4E LAZY DoG.
然后我想提取 QUICK
和 OV3R 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/