2010-12-14 2 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 Is Entering100Text Nogo

Желаемая:

Некоторые 440 Camel 220 Ввод 100 Текст Nogo

Итак, как мне теперь вставить пробел между буквами и цифрами ?.

ответ

2

Изменение первого подмена быть:

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

Смотрите также perldoc perlre.

+0

Я проголосовал за это как ответ, потому что мне нужно использовать только две строки, а не четыре, чтобы получить желаемый результат. Хотя я должен признать, что я все еще работаю над тем, что происходит там! – DulcimerDude

+0

Он в основном делает то же самое, что и мой ответ. Первая половина группировки (разделенная символом '|') соответствует переходу между строчными буквами и буквами верхнего регистра или цифрами, а вторая половина соответствует переходу между числами и прописными буквами. Эта версия не превратит 'a440' в' a 440'; моя воля. Я не знаю, если это имеет значение. Я также считаю, что внешняя '(?: ...)' не нужна. На самом деле в этом выражении он ничего не делает. – mkb

+0

Я должен потратить немного времени и обмотать голову вокруг этого. Я думаю, что немного понимаю. Я собираюсь поиграть с этим, пока я не смогу написать сам (за исключением замены одного персонажа)! Еще раз спасибо ... – DulcimerDude

0

Добавьте следующие две замены:

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

Первые вставляет пробел в любом переходе между цифрой и буквой. Модификатор i в конце делает выражение нечувствительным к регистру. Второй делает наоборот.

+0

Спасибо, что работал хорошо, и я мог понять, что происходит. Мне жаль, что я не смогу выбрать как ваши, так и eugene y как ответы, потому что они для меня ценны. – DulcimerDude

0

Продолжая с прошлой ночью, 5.10+ решение,

$camel =~ s/(?:\p{Lu}\p{Ll}*+|[0-9]++)(?!\W)\K/ /g; 

С \ р {} свойства [1], что tchrist заставил меня заново:) Это в основном такое же решение, как в прошлый раз, но теперь мы проверьте также числа.

1: http://perldoc.perl.org/perluniprops.html#Properties-accessible-through- \ р {} - И-\ P {}

Смежные вопросы