## Seriously, 43 bytes 6╙¬▀'_+,;)-@s`;0@Eùk`M┬i;╗;lrZ`i@╜í=`M@░' j [Try it online!](http://seriously.tryitonline.net/#code=NuKVmcKs4paAJ18rLDspLUBzYDswQEVrYE3ilKxpYMO5YE074pWXO2xyWmBpQOKVnMOtPWBNQOKWkScgag&input=Ii4uLm1heWJlIHNvbWUgZGF5IDEgcGx1cyAyIHBsdXMgMjAgY291bGQgcmVzdWx0IGluIDMi) The lack of regex capabilities made this much more difficult than it needed to be. Explanation: 6╙¬▀'_+,;)-@s`;0@Eùk`M┬i;╗;lrZ`i@╜í=`M@░' j 6╙¬▀ push digits in base 62 (uppercase and lowercase letters and numbers) '_+ prepend underscore ,;) push two copies of input, move one to bottom of stack - get all characters in input that are not letters, numbers, or underscores @s split input on all occurrences of non-word characters `;0@Eùk`M for each word: push the first letter (lowercased) ┬i transpose and flatten (TOS is list of first letters, then list of words) ;╗ push a copy of the first letters list to register 0 ;lrZ zip the list of first letters with their positions in the list `i@╜í=`M for each first letter: push 1 if that is the first time the letter has been encountered (first index of the letter matches its own index) else 0 @░ filter words (take words where corresponding element in the previous list is truthy) ' j join on spaces