Ok… I have an unsatisfactory solution to a problem.
The problem is I have input like so:
{sup 19}F({sup 3}He,t){sup 19}Ne(p){sup 18}F
and need output like so:
¹⁹F(³He,t)¹⁹Ne(p)¹⁸F
I use a series of replacements first to split each of the {sup xx} sections into {sup x}{sup x} and then use a regex to match each of those and replace the characters with their UTF-8 single equivalents. The “problem” is that the {sup} sections can have numbers 1, 2 or 3 digits long (maybe more, I don’t know), and I want to “expand” them into separate {sup} sections with one digit each. ( I also have the same problem with {sub} for subscripts… )
My current solution looks like this (in java):
retval = retval.replaceAll("\\{sup ([1-9])([0-9])\\}", "{sup $1}{sup $2}");
retval = retval.replaceAll("\\{sup ([1-9])([0-9])([0-9])\\}", "{sup $1}{sup $2}{sup $3}");
My question: is there a way to do this in a single pass no matter how many digits ( or at least some reasonable number ) there are?
Yes, but it may be a bit of a hack, and you’ll have to be careful it doesn’t overmatch!
Regex:
Replacement String:
A short explanation:
In plain English: it matches a single digit, only when looking ahead there’s a
}with optional digits in between. If possible, the substrings{supand}are also replaced.EDIT:
A better one is this:
That way, digits like in the string
"set={123}"won’t be replaced. The\Gin my second regex matches the spot where the previous match ended.