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;