Nie mogłem sprawić, aby rozwiązanie aix działało (i nie działa też na RegExr), więc wymyśliłem własne, które przetestowałem i wydaje się, że robi dokładnie to, czego szukasz:
((^[a-z]+)|([A-Z]{1}[a-z]+)|([A-Z]+(?=([A-Z][a-z])|($))))
a oto przykład użycia:
; 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)
Tutaj oddzielam każde słowo spacją, więc oto kilka przykładów przekształcania ciągu:
- ThisIsATitleCASEString => To jest ciąg tytułu CASE
- andThisOneIsCamelCASE => i This One Is Camel CASE
Powyższe rozwiązanie robi to, o co prosi oryginalny post, ale potrzebowałem również wyrażenia regularnego, aby znaleźć ciągi wielbłąda i pascala zawierające liczby, więc wymyśliłem również tę odmianę, aby uwzględnić liczby:
((^[a-z]+)|([0-9]+)|([A-Z]{1}[a-z]+)|([A-Z]+(?=([A-Z][a-z])|($)|([0-9]))))
i przykład użycia:
; 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)
A oto kilka przykładów tego, jak ciąg z liczbami jest przekształcany za pomocą tego wyrażenia regularnego:
- myVariable123 => moja zmienna 123
- my2Variables => my 2 Variables
- The3rdVariableIsHere => 3 rdVariable jest tutaj
- 12345NumsAtTheStartIncludedToo => 12345 Numery na początku również wliczone
^
i innego warunkowego przypadku dla wielkich liter w ujemnej pozycji wstecznej. Nie testowałem na pewno, ale myślę, że byłby to najlepszy sposób na naprawienie problemu.