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

时间:2014-08-13 13:03:17

标签: regex perl

考虑我有像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";

4 个答案:

答案 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;

另一种方法是使用splitjoin代替正则表达式:

$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;