DEV Community is a community of 781,893 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Discussion on: Solving "Spinal Tap Case" / freeCodeCamp Algorithm Challenges

Replies for: How do you like this? const spinalCase = s => s.replace( /(?<=[Aa-z])(?=[A-Z][a-z])|(?<=[a-z])(?=A)|[^A-Za-z]+/g , '-' ) ...

willsmart

Well, it's a trade-off. On the one hand "AAAA" is the word "A" four times in UpperCamelCase, on the other hand it's the word "AAAA" in CONSTANT_CASE. In the end the problem is just ambiguous.

You've solved the tradeoff by only breaking camelcase words where the next word has more than one char
That may be a fair strategy since it means that constant case is well covered, but does mean some pretty reasonable camel case sentences won't work. ("ThisIsASpinalTap" -> "this-isa-spinal-tap" )

In the end, it's about figuring out which cases are important and what rules you want to cover.

I think a good medium might be to take blocks of uppercase letters surrounded by non-letters, and stop them from being clobbered as camel case words by lowercasing them.

f = s => s
.replace(
/(?<=[^A-Za-z]|^)[A-Z]+(?=[^A-Za-z]|\$)/g,
w=>w.toLowerCase()
)
.replace( // edited to handle numbers a bit
/(?<=[A-Za-z])(?=[A-Z0-9])|(?<=[0-9])(?=[A-Za-z])|[^A-Za-z0-9]+/g,
'-'
).toLowerCase()

a=[
"ThisIsASpinalTapAAAA",
"THIS_IS_A_SPINAL_TAP_A_A_A_A",
"thisIsASpinalTapAAAA",
"this-is-a-spinal-tap-a-a-a-a",
"this is a spinal tap a a a a"
]
a.map(f)
// -> [
"this-is-a-spinal-tap-a-a-a-a",
"this-is-a-spinal-tap-a-a-a-a",
"this-is-a-spinal-tap-a-a-a-a",
"this-is-a-spinal-tap-a-a-a-a",
"this-is-a-spinal-tap-a-a-a-a"
]