我想写一个perl正则表达式来将一些模式替换为其他模式。源模式是小写,后跟大写。目标模式是小写,后跟点,空格和大写。
以下是一个例子:
CamelCase
我想将其更改为以下内容:
Camel. Case
提前致谢!
答案 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
答案 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;