Regex 如何在Perl中压缩独立字符?

Regex 如何在Perl中压缩独立字符?,regex,perl,Regex,Perl,我试图识别并压缩字符串中的单个(大写)字符 例如: “测试A B测试”->“测试AB测试” “测试A B C测试”->“测试ABC测试” “测试A B测试C D E测试”->“测试AB测试CDE测试” 我将其用于单个事件(如上面的第一个示例中),但不知道如何将其链接到多个事件 $str =~ s/ ([A-Z]) ([A-Z]) / \1\2 /g; 当我看到解决方案时,我可能会觉得自己很愚蠢,但我已经做好了准备。提前感谢。它不起作用的原因是您的正则表达式中有前导空格和尾随空格。一旦“AB C

我试图识别并压缩字符串中的单个(大写)字符

例如:

“测试A B测试”->“测试AB测试”

“测试A B C测试”->“测试ABC测试”

“测试A B测试C D E测试”->“测试AB测试CDE测试”

我将其用于单个事件(如上面的第一个示例中),但不知道如何将其链接到多个事件

$str =~ s/ ([A-Z]) ([A-Z]) / \1\2 /g;
当我看到解决方案时,我可能会觉得自己很愚蠢,但我已经做好了准备。提前感谢。

它不起作用的原因是您的正则表达式中有前导空格和尾随空格。一旦“AB C”变成“AB C”,B就不再有前导空间——A在那里

$str =~ s/\b([A-Z])\s+(?=[A-Z]\b)/$1/g;
最简单的解决方案是取出这些内容并使用
s/([A-Z])([A-Z])/\1\2/g
,它应该满足规定的要求,但它也会将所有caps短语转换为一个字母块(例如,“这是一个测试”->“ThisisTest”),这可能是您无法接受的


如果您只需要折叠单个大写字母,而不需要折叠它们的组(例如,“FOR I M A TEST”->“FOR IMA TEST”,而不是“FORIMATEST”),那么我认为使用单个正则表达式是不可能的。您必须分两次完成此操作,一次标记要折叠的空格,另一次实际删除标记(例如,“对于I^M^A测试”->“对于I^M^A测试”->“对于IMA测试”)因为您无法区分原来成对的一对大写字母和原来以空格分隔但已折叠的一对大写字母。

我看到“\1”已更改为“$1”。这两个版本似乎都能工作……那么有什么区别呢?单词边界断言(
\b
)可能不是您想要的。如果字符串
“abc!”
应该变成
“abc!”
,则需要使用其他内容。另外,如果
“ABC1”
应该变成
“ABC1”
,那么你需要使用其他东西。@brydgesk阅读
perl-Mdiagnostics-e'$”=~s/(A)/\1/“
的输出,基本上这是一个风格和一致性问题(例如
\10
可能并不意味着你认为它会做什么,但
$10
确实如此)。我想\b开头应该可以,但结尾我想查找空格或字符串/行的结尾。@bry:Oops。那只是因为我在用Python测试正则表达式,它不接受
$1