Замена chemform в вики - регулярное выражение

Не могли бы вы дать мне совет, я заменяю<chemform> код из моей вики, который больше не используется ... Строки обычно такие простые:

<chemform>CH3COO-</chemform>
<chemform>Ba2+</chemform>
<chemform>H2CO3</chemform>

Мне нужно, чтобы они были заменены этими:

CH<sub>3</sub>COO<sup>-</sup>
Ba<sub>2</sub><sup>+</sup>
H<sub>2</sub>CO<sub>3</sub>

До сих пор я придумал это регулярное выражение дляИнструмент RegExr:

match: <chemform\b[^>]*>(\D*?)([0-9]*)(\D*?)(\D*?)([0-9]*)(\D*?)([-+]*?)</chemform>

replace: $1<sub>$2</sub>$3$4<sub>$5</sub>$6<sup>$7</sup>

Я знаю, что код ужасен, но пока он работает для меня, за исключением того факта, что он дает мне пустые строки, такие как<sub></sub>:

<sub></sub>CH<sub>3</sub>COO<sup>-</sup>
<sub></sub>Ba<sub>2</sub><sup>+</sup>
H<sub>2</sub>CO<sub>3</sub><sup></sup>

Как я могу избавиться от них, не делая второй поиск замены? Большое спасибо!

 Sidd Sidd20 июн. 2012 г., 01:42
Это<chemform>CH3COO-</chemform> <chemform>Ba2+</chemform> <chemform>H2CO3</chemform>
 David20 июн. 2012 г., 00:27
У вас есть вход, который привел к пустым строкам, показанным выше?
 Qtax20 июн. 2012 г., 00:24
Не будет работать, например, на<chemform>NH4C2H3O2</chemform>, Почти по той же причине. Вы можете использовать регулярные выражения, чтобы соответствовать<chemform> теги, затем используйте отдельную функцию для анализа и создания замены.

Ответы на вопрос(1)

Вы можете использовать Notepad ++, который может переходить к условным заменам (подробности можно найти впредыдущий пост отWiktor Stribi & # x17C; ew).

Используйте следующие шаблоны:

match: ([A-Za-z]+(?=[-+\d]))(?<sub>\d+)?(?<sup>[-+])?(?=[-+\w]*</chemform>) replace: $1(?{sub}<sub>$+{sub}</sub>)(?{sup}<sup>$+{sup}</sup>)

Учитывая ваш входной образец, я получаю:

<chemform>CH<sub>3</sub>COO<sup>-</sup></chemform>  
<chemform>Ba<sub>2</sub><sup>+</sup></chemform>  
<chemform>H<sub>2</sub>CO<sub>3</sub></chemform>

Ваш ответ на вопрос