2010-12-14 90 views
2

这是我原来的问题的延续: Perl- How do I insert a space before each capital letter except for the first occurrence or existing?如何在字母字符和数字字符之间插入空格?

我是能够实现与字符串中只有字母大写之间插入空格的一个期望的结果:

my $camel ="SomeCamel IsEnteringText"; 
$camel =~ s/(?<=[a-z])(?=[A-Z])/ /g; 
$camel =~ s/([^[:space:]]+)/\u$1/g; 

打印:

一些骆驼正在输入文字

但是,当数字是目前我遇到了问题:

my $camel ="Some 440Camel220 IsEntering100Text Nogo"; 
$camel =~ s/(?<=[a-z])(?=[A-Z])/ /g; 
$camel =~ s/([^[:space:]]+)/\u$1/g; 

打印:

一些440Camel220是Entering100Text的Nogo

期望:

一些440骆驼220输入100文字Nogo

那么,我现在该如何在字母和数字之间插入一个空格?

回答

2

变化的第一个换人是:

$camel =~ s/(?<=[a-z])(?=[A-Z0-9])|(?<=[0-9])(?=[A-Z])/ /g; 

又见perldoc perlre

+0

我投了这个答案,因为我只需要使用两行而不是四行来获得我想要的结果。虽然我不得不承认,但我仍在努力研究那里发生的事情! – DulcimerDude 2010-12-14 14:23:39

+0

他基本上和我的答案一样。分组的前半部分(用'|'分隔)匹配小写字母和大写字母或数字之间的转换,后半部分匹配数字和大写数字之间的转换。这个版本不会把'a440'变成'440';我的意志。我不知道这是否重要。我也认为最外层的'(?:...)'是不必要的。事实上,在这个表达中,它什么都不做。 – mkb 2010-12-14 14:25:27

+0

我必须花一些时间,并围绕这一点。我想我已经得到了一点。我不想玩这个游戏,直到我真的能够自己写一个(单个字符替换之外)!再次感谢你... – DulcimerDude 2010-12-14 14:33:20

0

添加以下两个取代:

$camel =~ s/(?<=[0-9])(?=[a-z])/ /ig; 
$camel =~ s/(?<=[a-z])(?=[0-9])/ /ig; 

第一插入件的空间在一个数字和字母之间的任何过渡。末尾的i修饰符使表达式不区分大小写。第二个是相反的。

+0

谢谢你,运作良好,我能理解发生了什么事情。我希望我可以选择你和eugene y作为答案,因为它们对我都很有价值。 – DulcimerDude 2010-12-14 14:23:16

相关问题