No pude hacer que la solución de aix funcionara (y tampoco funciona en RegExr), así que se me ocurrió la mía propia que probé y parece hacer exactamente lo que estás buscando:
((^[a-z]+)|([A-Z]{1}[a-z]+)|([A-Z]+(?=([A-Z][a-z])|($))))
y aquí hay un ejemplo de cómo usarlo:
; Regex Breakdown: This will match against each word in Camel and Pascal case strings, while properly handling acrynoms.
; (^[a-z]+) Match against any lower-case letters at the start of the string.
; ([A-Z]{1}[a-z]+) Match against Title case words (one upper case followed by lower case letters).
; ([A-Z]+(?=([A-Z][a-z])|($))) Match against multiple consecutive upper-case letters, leaving the last upper case letter out the match if it is followed by lower case letters, and including it if it's followed by the end of the string.
newString := RegExReplace(oldCamelOrPascalString, "((^[a-z]+)|([A-Z]{1}[a-z]+)|([A-Z]+(?=([A-Z][a-z])|($))))", "$1 ")
newString := Trim(newString)
Aquí estoy separando cada palabra con un espacio, así que aquí hay algunos ejemplos de cómo se transforma la cadena:
- ThisIsATitleCASEString => Esta es una cadena de título CASE
- andThisOneIsCamelCASE => y este es Camel CASE
Esta solución anterior hace lo que pide la publicación original, pero también necesitaba una expresión regular para encontrar cadenas de camello y pascal que incluían números, por lo que también se me ocurrió esta variación para incluir números:
((^[a-z]+)|([0-9]+)|([A-Z]{1}[a-z]+)|([A-Z]+(?=([A-Z][a-z])|($)|([0-9]))))
y un ejemplo de su uso:
; Regex Breakdown: This will match against each word in Camel and Pascal case strings, while properly handling acrynoms and including numbers.
; (^[a-z]+) Match against any lower-case letters at the start of the command.
; ([0-9]+) Match against one or more consecutive numbers (anywhere in the string, including at the start).
; ([A-Z]{1}[a-z]+) Match against Title case words (one upper case followed by lower case letters).
; ([A-Z]+(?=([A-Z][a-z])|($)|([0-9]))) Match against multiple consecutive upper-case letters, leaving the last upper case letter out the match if it is followed by lower case letters, and including it if it's followed by the end of the string or a number.
newString := RegExReplace(oldCamelOrPascalString, "((^[a-z]+)|([0-9]+)|([A-Z]{1}[a-z]+)|([A-Z]+(?=([A-Z][a-z])|($)|([0-9]))))", "$1 ")
newString := Trim(newString)
Y aquí hay algunos ejemplos de cómo una cadena con números se transforma con esta expresión regular:
- myVariable123 => mi Variable 123
- my2Variables => mis 2 variables
- The3rdVariableIsHere => La 3 rdVariable está aquí
- 12345NumsAtTheStartIncludedToo => 12345 Nums al principio también incluidos
^
y otro caso condicional para letras mayúsculas en la búsqueda hacia atrás negativa. No lo he probado con seguridad, pero creo que esa sería su mejor opción para solucionar el problema.