Background
Character classes are a standard way to indicate a set of characters to match in regular expressions. For example, the class [ab]
matches a or b, [a-z]
matches any lower case letter, and [^a]
matches everything but a. For the purpose of this question, classes can contain:
- a sequence of characters to match, where the characters
\
,]
,-
and^
must normally be escaped with a\
. - a range of characters to match, indicated by separating two characters with a
-
: e.g.[0-9]
. Note that if-
is the first or last character in a class then it need not be escaped, as it's not indicating a range. - a combination of sequences and ranges: e.g.
[ac-fhk-o]
. Note that the class cannot be empty, and if]
is the first character in the class then it need not be escaped. - a complement match indicated by the first character in the class being
^
: e.g.[^a-z]
. Note that if^
is not the first character in the class, then it need not be escaped.
Task
Given a non-empty string made up of printable ASCII characters (" " to "~" = 0x20-0x7E), output the shortest character class that matches precisely those characters. The string may contain duplicate characters. Default Input/Output methods apply.
Scoring
This is code-golf, so shortest code in bytes wins, with all the standard loopholes forbidden.
Test cases
"the" => "[the]" or "[eht]" etc
"faced" => "[ac-f]" or "[c-fa]"
"0-121" => "[-0-2]" or "[012-]" etc
"]" => "[]]"
"[-^]" => "[][^-]" or "[]^[-]"
"[\]" => "[[-\]]" or "[]\\[]" or "[][\\]"