【发布时间】:2014-03-14 22:47:15
【问题描述】:
我想编写一个 perl 正则表达式来将某些模式替换为其他模式。源模式是小写后跟大写。目标模式是小写字母后跟点、空格和大写字母。
这是一个例子:
CamelCase
我想改成如下:
Camel. Case
提前致谢!
【问题讨论】:
我想编写一个 perl 正则表达式来将某些模式替换为其他模式。源模式是小写后跟大写。目标模式是小写字母后跟点、空格和大写字母。
这是一个例子:
CamelCase
我想改成如下:
Camel. Case
提前致谢!
【问题讨论】:
另一种也接受 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
【讨论】:
我建议如下:
$StringToConvert = s/([A-Z][a-z]+)(?=[A-Z])/$1\. /g;
积极的展望“(?=[A-Z])”是关键。唯一被替换的词是那些前面有另一个大写字符的词。
还要注意“g”,它表示全局搜索字符串。结果如下:
CamelCase
Camel. Case
还有
CamelCaseMultiple
Camel. Case. Multiple
字符串中可能有尽可能多的大写单词。
【讨论】:
使用拆分和连接的解决方案:
my $str = 'CamelCase';
my @words = split /(?=[A-Z])/, $str;
print join '. ', @words;
【讨论】:
theEEUU。
my @words = split /(?<![A-Z])(?=[A-Z])/, $str;。