I would like to split this string:
lg:[:after]:hover:color-blue
The two conditions are:
- Split by
: - If there’s a
[], get the content (even if there’s a:inside)
The result would be
lg:afterhovercolor-blue
Possible inputs would be:
[:after]:hover:color-bluehover:color-bluelg:hover:color-blue
What I have so far:
const regex = /(?:([^\:\[\]]+)|\[([^\[\]]+)\])/g;
const matches = [...string.matchAll(regex)].map((match) =>
typeof match[2] !== "undefined" ? match[2] : match[1]
);
It works well but the map feels hacky.
Is there a way to get the desired output directly from the regex?
>Solution :
Yes:
(?<=\[)[^[\]]+(?=]) # 1+ non-square-brackets inside a pair of those
| # or
(?<=^|:)[^[\]:]+ # 1+ non-square-brackets-or-colons
# preceded by either the start of string or a colon.
Try it on regex101.com.
Note that we need to use .match() instead of .split():
string.match(/(?<=\[)[^[\]]+(?=])|(?<=^|:)[^[\]:]+/g)
Try it:
console.config({ maximize: true });
const testcases = [
'lg:[:after]:hover:color-blue',
'[:after]:hover:color-blue',
'hover:color-blue',
'lg:hover:color-blue'
];
const regex = /(?<=\[)[^[\]]+(?=])|(?<=^|:)[^[\]:]+/g;
for (const testcase of testcases) {
console.log(testcase.match(regex));
}
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>