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

时间:2010-05-17 18:04:28

标签: 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;
当我看到解决方案时,我可能会感到愚蠢,但我已经为此做好了准备。提前谢谢。

2 个答案:

答案 0 :(得分:2)

$str =~ s/\b([A-Z])\s+(?=[A-Z]\b)/$1/g;

答案 1 :(得分:1)

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

最简单的解决方案是将它们拿出并使用s/([A-Z]) ([A-Z])/\1\2/g来满足规定的要求,但它也会将所有大写字母变成一个单独的字母块(例如,“这是一个测试” - >“THISISATEST”),您可能无法接受。

如果你只需要折叠单个大写字母而不是它们的组(例如,“IMA TEST” - >“IMA TEST”,而不是“FORIMATEST”),那么我认为这不可能单一的正则表达式。您必须分两次进行,一次用于标记要折叠的空间,第二次用于实际删除标记(例如,“FOR IMA TEST” - >“FOR I ^ M ^ A TEST” - >“对于IMA TEST“),因为你无法区分最初配对的一对大写字母和最初以空格分隔但已经折叠的大写字母。