Regex Perl简单正则表达式大写单词,用下划线分隔

Regex Perl简单正则表达式大写单词,用下划线分隔,regex,perl,Regex,Perl,假设我有类似于print\u this\u text\u in\u camel\u case的字符串,我想将第一个单词和下划线后的每个单词都大写,因此结果将是print\u this\u text\u in\u camel\u case。下面的测试对第一个单词不起作用 #!/usr/bin/perl my $str = "print_this_text_in_camel_case"; $str =~ s/(_.)/uc($1)/ge; print $str, "\n"; 只需修改正则表达

假设我有类似于
print\u this\u text\u in\u camel\u case
的字符串,我想将第一个单词和下划线后的每个单词都大写,因此结果将是
print\u this\u text\u in\u camel\u case
。下面的测试对第一个单词不起作用

#!/usr/bin/perl

my $str = "print_this_text_in_camel_case";

$str =~ s/(_.)/uc($1)/ge;

print $str, "\n";

只需修改正则表达式以匹配第一个字符:

#!/usr/bin/perl

my $str = "print_this_text_in_camel_case";

$str =~ s/(_.|^.)/uc($1)/ge;

print $str, "\n";
将打印:

Print_This_Text_In_Camel_Case
你也可以使用


您需要添加字符串锚点的开头作为下划线的替代

对于Perl 5.10+,我将使用
\K
(keep)转义来模拟可变宽度的查找,并且只使用大写字母。我还将使用
\U
来执行替换文本中的大写字母,而不是
uc
/e
(eval)修饰符

$str =~ s/(?:^|_)\K(.)/\U$1/g;
如果您使用的是较旧版本的Perl(不含
\K
),则可以这样做:

$str =~ s/(^|_)(.)/$1\U$2/g;
另一种选择是使用
split
join
代替正则表达式:

$str = join '_', map { ucfirst } split /_/, $s;

在后面用消极的眼光看是最整洁的。此代码片段将大写前面没有字母的所有字母

my $str = "print_this_text_in_camel_case";

$str =~ s/ (?<!\p{alpha}) (\p{alpha}) /uc $1/xgei;

print $str, "\n";
如果您愿意,或者如果您有一个不支持Unicode属性的非常旧的Perl副本,您可以使用
[a-z]
而不是od
\p{alpha}
,如下所示

$str =~ s/ (?<![a-z]) ([a-z]) /uc $1/xige;
$str=~s/(?
这会产生相同的结果

Print_This_Text_In_Camel_Case
$str =~ s/ (?<![a-z]) ([a-z]) /uc $1/xige;