Perl-如何在每个大写字母前插入一个空格,除了第一次出现或存在?

时间:2010-12-13 23:17:34

标签: perl space

我有一个字符串:

 SomeCamel WasEnteringText

我找到了各种方法来分割字符串并使用php str_replace插入空格,但我需要它在perl中。

有时在字符串之前可能有空格,有时则没有。有时字符串中会有一个空格,但有时不会。

我试过了:

    my $camel = "SomeCamel WasEnteringText";
    #or
    my $camel = " SomeCamel WasEntering Text";
    $camel =~ s/^[A-Z]/\s[A-Z]/g;
    #and
    $camel =~ s/([\w']+)/\u$1/g;

和= ~s // g的更多组合;经过多次阅读。

我需要一位大师将这头骆驼指向一片绿洲。

好的,根据下面的输入,我现在有:

$camel =~ s/([A-Z])/ $1/g;
$camel =~ s/^ //; # Strip out starting whitespace
$camel =~ s/([^[:space:]]+)/\u$1/g;

哪个完成但看起来过分了。虽然有效。

4 个答案:

答案 0 :(得分:4)

s/(?<!^)[A-Z][a-z]*+(?!\s+)\K/ /g;

越少“搞这个马匹”版本:

s/
 (?<!^)          #Something not following the start of line,
    [A-Z][a-z]*+ #That starts with a capital letter and is followed by
                 #Zero or more lowercased letters, not giving anything back,
 (?!\s+)          #Not followed by one or more spaces,
\K               #Better explained here [1]
/ /gx;            #"Replace" it with a space.
编辑:我注意到,当你在混音中添加标点时,这也增加了额外的空格,这可能不是OP想要的;幸运的是,修复只是简单地将负面观察从\ s +改为\ W +。虽然现在我开始想知道为什么我实际上添加了这些优点。小子,我!

EDIT2:呃,道歉,最初忘了/ g旗帜。

EDIT3:好的,有人请求我。我变得迟钝了。不需要消极的外观^ - 我真的把球放在了这个上面。希望修复:

s/[A-Z][a-z]*+(?!\W)\K/ /gx;

1:http://perldoc.perl.org/perlre.html

答案 1 :(得分:2)

尝试:

$camel =~ s/(?<! )([A-Z])/ $1/g; # Search for "(?<!pattern)" in perldoc perlre 
$camel =~ s/^ (?=[A-Z])//; # Strip out extra starting whitespace followed by A-Z

请注意$camel =~ s/([^ ])([A-Z])/$1 $2/g;的明显尝试有一个错误:如果彼此之后有大写字母则不起作用(例如“ABCD”将转换为“ABCD”而不是“ABCD”)

答案 2 :(得分:0)

尝试:     s /(?&lt; = [a-z])(?= [A-Z])/ / g

在小写字符(即不是空格或字符串的开头)以及大写字母前后插入空格。

答案 3 :(得分:0)

改善......

... Hughmeir&#39; s,这也适用于以小写字母开头的数字和单词。

s/[a-z0-9]+(?=[A-Z])\K/ /gx

测试

 myBrainIsBleeding     => my_Brain_Is_Bleeding
 MyBrainIsBleeding     => My_Brain_Is_Bleeding
 myBRAInIsBLLEding     => my_BRAIn_Is_BLLEding
 MYBrainIsB0leeding    => MYBrain_Is_B0leeding
 0My0BrainIs0Bleeding0 => 0_My0_Brain_Is0_Bleeding0