如何构造Perl正则表达式替换(小写后跟大写)(小写。大写)?

时间:2014-03-14 22:47:15

标签: regex perl

我想写一个perl正则表达式来将一些模式替换为其他模式。源模式是小写,后跟大写。目标模式是小写,后跟点,空格和大写。

以下是一个例子:

CamelCase

我想将其更改为以下内容:

Camel. Case

提前致谢!

3 个答案:

答案 0 :(得分:4)

另一种接受utf8的解决方案:

use Modern::Perl;
use utf8;
use Encode qw(encode);

foreach ( qw(CamelCase ČamelČasě ŽaBaČek) ) {
    say Encode::encode('utf8', "$1. $2")
        if( m{(\b\p{Upper}\w*)((?:\p{Lower}\w*\p{Upper}|\p{Upper}\w*\p{Lower})\w*\b)} );
}

产生

Camel. Case
Čamel. Časě
ŽaBa. Ček

基于:https://stackoverflow.com/a/6323679/632407

答案 1 :(得分:3)

我建议如下:

$StringToConvert = s/([A-Z][a-z]+)(?=[A-Z])/$1\. /g;

正向前看“(?= [A-Z])”是关键。被替换的唯一单词是那些在其前面具有另一个大写字符的单词。

另请注意“g”表示全局搜索字符串。这导致以下结果:

CamelCase
Camel. Case

以及

CamelCaseMultiple
Camel. Case. Multiple

在字符串中可能存在尽可能多的大写单词。

答案 2 :(得分:1)

使用拆分和连接的解决方案:

my $str = 'CamelCase';

my @words = split /(?=[A-Z])/, $str;

print join '. ', @words;