Как заменить последний матч регулярного выражения? - PullRequest
0 голосов
/ 17 января 2020
const spaceRegex = /<mspace\s+.*?\/>/
const answer = '<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>h</mi><mfenced><mi>x<mspace linebreak="newline"/></mi></mfenced><mo>=</mo><semantics><mrow><mo>-</mo><mn>3</mn></mrow></semantics><mspace linebreak="newline"/><mi>D</mi><mo>=</mo><mi mathvariant="normal">&#x211D;</mi></math>'

У меня есть регулярное выражение для совпадения <mspace .... />, в приведенном выше ответе есть два совпадения. Я хочу заменить последнее совпадение на <mspace width="10px"/>

Так что я хочу, чтобы вывод был,

'<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>h</mi><mfenced><mi>x<mspace linebreak="newline"/></mi></mfenced><mo>=</mo><semantics><mrow><mo>-</mo><mn>3</mn></mrow></semantics><mspace width="10px"/><mi>D</mi><mo>=</mo><mi mathvariant="normal">&#x211D;</mi></math>'

1 Ответ

0 голосов
/ 17 января 2020

Regex - неправильный способ справиться с XML.
. Лучше использовать DOMParser и XMLSerializer , чтобы вы могли проходить через DOM и обновлять элементы, используя DOM методы:

const answer = '<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>h</mi><mfenced><mi>x<mspace linebreak="newline"/></mi></mfenced><mo>=</mo><semantics><mrow><mo>-</mo><mn>3</mn></mrow></semantics><mspace linebreak="newline"/><mi>D</mi><mo>=</mo><mi mathvariant="normal">&#x211D;</mi></math>';

const D = (new DOMParser()).parseFromString(answer, "text/xml")

const mspaces = D.getElementsByTagName('mspace');
mspaces[mspaces.length-1].outerHTML = '<mspace width="10px"/>';

const updated = (new XMLSerializer()).serializeToString(D);

console.log(updated)
.as-console-wrapper {top:0; max-height:none !important}

Решение для регулярных выражений также доступно, но менее надежно:

const answer = '<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>h</mi><mfenced><mi>x<mspace linebreak="newline"/></mi></mfenced><mo>=</mo><semantics><mrow><mo>-</mo><mn>3</mn></mrow></semantics><mspace linebreak="newline"/><mi>D</mi><mo>=</mo><mi mathvariant="normal">&#x211D;</mi></math>';

const updated = answer.replace(/(.*)<mspace[^/]+\/>/, '$1<mspace width="10px"/>');

console.log(updated)
.as-console-wrapper {top:0; max-height:none !important}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...