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

Regex 如何构造Perl正则表达式将(小写后接大写)替换为(小写。大写)?,regex,perl,Regex,Perl,我想编写一个perl正则表达式,将某些模式替换为其他模式。源模式为小写,后跟大写。目标模式为小写,后跟点、空格和大写 以下是一个例子: CamelCase 我想将其更改为以下内容: Camel. Case $StringToConvert = s/([A-Z][a-z]+)(?=[A-Z])/$1\. /g; CamelCase Camel. Case 提前谢谢 我建议如下: Camel. Case $StringToConvert = s/([A-Z][a-z]+)(?=[A-Z])

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

以下是一个例子:

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

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

提前谢谢

我建议如下:

Camel. Case
$StringToConvert = s/([A-Z][a-z]+)(?=[A-Z])/$1\. /g;
CamelCase
Camel. Case
积极的前瞻性“(?=[A-Z])”是关键。唯一被替换的单词是前面有另一个大写字符的单词

还要注意“g”,它表示全局搜索字符串。其结果如下:

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

CamelCaseMultiple
Camel. Case. Multiple

对于字符串中可能存在的尽可能多的大写单词,我建议如下:

Camel. Case
$StringToConvert = s/([A-Z][a-z]+)(?=[A-Z])/$1\. /g;
CamelCase
Camel. Case
积极的前瞻性“(?=[A-Z])”是关键。唯一被替换的单词是前面有另一个大写字符的单词

还要注意“g”,它表示全局搜索字符串。其结果如下:

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

CamelCaseMultiple
Camel. Case. Multiple

字符串中可能有多少大写单词,请按on键和on键。

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

my $str = 'CamelCase';

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

print join '. ', @words;

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

my $str = 'CamelCase';

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

print join '. ', @words;

另一个也接受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

基于:

另一个也接受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

基于:

此解决方案还将更改几个紧跟其后的大写字母,如:
theEEUU
。是的,如果OP想要避免边缘大小写,则必须将解决方案修改为
my@words=split/(?。此解决方案还将更改几个紧随其后的大写字母,如:
theEEUU
。是的,如果OP想要避免这种边缘大小写,则必须将解决方案修改为
my@words=split/(?)?。