考虑我有像print_this_text_in_camel_case
这样的字符串,我希望将第一个单词和下划线后面的每个单词大写,因此结果将为Print_This_Text_In_Camel_Case
。以下测试对第一个单词不起作用。
#!/usr/bin/perl
my $str = "print_this_text_in_camel_case";
$str =~ s/(_.)/uc($1)/ge;
print $str, "\n";
答案 0 :(得分:5)
只需修改正则表达式以匹配第一个字符:
#!/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
答案 1 :(得分:2)
您需要添加一个字符串开头的锚点作为下划线的替代。
对于Perl 5.10+,我使用\K
(保持)转义来模拟可变宽度的后视并且只使用大写字母。我还使用use \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;
答案 2 :(得分:2)
使用负面的后卫是最整洁的。此代码片段大写所有字母前面都没有字母。
my $str = "print_this_text_in_camel_case";
$str =~ s/ (?<!\p{alpha}) (\p{alpha}) /uc $1/xgei;
print $str, "\n";
<强>输出强>
Print_This_Text_In_Camel_Case
如果您愿意,或者您有一个非常旧的Perl副本不支持Unicode属性,您可以使用[a-z]
代替od \p{alpha}
,就像这样
$str =~ s/ (?<![a-z]) ([a-z]) /uc $1/xige;
产生相同的结果。
答案 3 :(得分:1)
您也可以使用ucfirst
use feature 'say';
my $str = "print_this_text_in_camel_case";
my @split = map(ucfirst, (split/(_)/, $str));
say @split;