^(\d+)(gp|cr|mc)\s+([a-z A-Z',()0-9&~"\.-]{34})\s+(.+)$That {34} means to match exactly 34 characters, no more and no less. I also added other characters to the range ( [a-z A-Z',()0-9&~"\.-] ) that can appear in item names because I like to be as specific as possible, but .{34} will work just as well.
Answers
\s{2,} makes it only note whitespaces in groups of two or more
I was thinking there might be a way of changing this part:
[A-Za-z-\s]+
so that it will only ever match if the spaces inside are singular?
The (?<!\s{2}) means to go back and check for \s{2}, and don't match if it's found. Keep in mind this will still match a single space at the end, so you'd get "an oaken vial " for example. And you still have to worry about the situation I mentioned where there aren't any double spaces.
In your oak tun example, this will capture the item name with no extra spaces at the beginning or end. The first \s+ matches all the leading spaces, the (?: ?[a-zA-Z-]+)+ matches one or more instance of "zero or one spaces followed by a word", and the last \s+ will mark the end of the item name because it will match the first space that isn't followed by a word.
The pattern in your first post solved my issue with directory matching. I hadn't seen the long descs when I posted, but I did soon after when I began looking for weapons. Using fixed lengths didn't occur to me.
The other two solutions will come in handy for other things in the future (including outside mudding, at work.) So thanks for the really comprehensive answers!