Perl- Как мне вставить пробел перед каждой заглавной буквой, кроме первого или существующего? - PullRequest
2 голосов
/ 14 декабря 2010

У меня есть строка вроде:

 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 голосов
/ 14 декабря 2010
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.

РЕДАКТ.ОП хочет;К счастью, исправление просто изменяет негативный взгляд с \ s + на \ W +.Хотя сейчас я начинаю удивляться, почему я на самом деле добавил эти плюсы.Drats, me!

EDIT2: Хм, извинения, изначально забыл флаг / g.

EDIT3: Хорошо, кто-то снизил мне голос.Я отсталыйНет нужды в негативном взгляде за ... Я действительно бросил мяч на этот.Надеюсь исправлено:

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

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

2 голосов
/ 14 декабря 2010

Попробуйте:

$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»)

0 голосов
/ 02 апреля 2015

Улучшение ...

... on 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
0 голосов
/ 14 декабря 2010

Попробуйте: s / (? <= [Az]) (? = [AZ]) / / g </p>

Вставляется как пробел после символа нижнего регистра (то есть без пробела или начала строки)и перед, и заглавными буквами.

...