Ответ от DigitalRoss не распознает аббревиатуры, встроенные в CamelCase.Например, он разделит «MyHTMLTricks» на «My HTML 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);
}