Ответ от DigitalRoss не распознает аббревиатуры, встроенные в CamelCase. Например, он разделит «MyHTMLTricks» на «My H T M L Tricks» вместо «My HTML Tricks».
Вот еще один вариант на основе функции AsSpaced()
в PmWiki, который делает большую работу, чтобы быть чувствительным к случаям, как это:
"MyHTMLTricks" \
.gsub(/([[:lower:]\\d])([[:upper:]])/, '\1 \2') \
.gsub(/([^-\\d])(\\d[-\\d]*(|$))/,'\1 \2') \
.gsub(/([[:upper:]])([[:upper:]][[:lower:]\\d])/, '\1 \2')
=> "My HTML Tricks"
Другая вещь, которую я хотел об этом подходе является то, что он оставляет строку строка, вместо того, чтобы преобразовать ее в массив. Если вы действительно хотите массив, то просто добавьте раскол в конце.
"MyHTMLTricks" \
.gsub(/([[:lower:]\\d])([[:upper:]])/, '\1 \2') \
.gsub(/([^-\\d])(\\d[-\\d]*(|$))/,'\1 \2') \
.gsub(/([[:upper:]])([[:upper:]][[:lower:]\\d])/, '\1 \2') \
.split
=> ["My", "HTML", "Tricks"]
Для записи здесь приведен исходный код PHP из PmWiki.
function AsSpaced($text) {
$text = preg_replace("/([[:lower:]\\d])([[:upper:]])/", '$1 $2', $text);
$text = preg_replace('/([^-\\d])(\\d[-\\d]*(|$))/', '$1 $2', $text);
return preg_replace("/([[:upper:]])([[:upper:]][[:lower:]\\d])/", '$1 $2', $text);
}
Что бы вы хотели сделать с помощью 'ThisIsANarrowImageOfHIV? 'Присоединиться к n или разделить ВИЧ? –