2

我有一个像这样的字符串:

 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

4 回答 4

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:Erm,抱歉,最初忘记了 /g 标志。

EDIT3:好的,有人反对我。我变得迟钝了。不需要对 ^ 进行负面的回顾 - 我真的把球放在了这个上。希望修复:

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

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

于 2010-12-13T23:37:42.983 回答
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”而不是“ABC D”)

于 2010-12-13T23:30:25.127 回答
0

试试:s/(?<=[az])(?=[AZ])/ /g

这会在小写字符(即不是空格或字符串的开头)和大写字符之前插入空格。

于 2010-12-13T23:45:59.027 回答
0

改善...

...在Hughmeir上,这也适用于以小写字母开头的数字和单词。

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
于 2015-04-02T13:34:01.563 回答