Вопрос по regex – Замена chemform в вики - регулярное выражение

1

Не могли бы вы дать мне совет, я заменяю<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>

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

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

Ваш Ответ

1   ответ
0

Вы можете использовать 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>

Похожие вопросы