как заменить конкретное вхождение строки на регулярное выражение в javascript - PullRequest
0 голосов
/ 19 февраля 2020

вот код, он для одной строки, но он не работает для многострочного текста. Я извлекаю данные из файла xml.

let xmlData = `<?xml version="1.0" encoding="utf-8"?>
    <RecipeData>
    <SUNDAY Value="1"/>
    <SUNDAY/>
    <SUNDAY/>
    <SUNDAY/>
    <MONDAY Value="1"/>
    </MONDAY>
    <MONDAY>
    </MONDAY>
    </RecipeData>`;
    search = '<SUNDAY/>'
    let n = 2
    console.log(xmlData.replace(RegExp("((<SUNDAY(\s*)\/(\s*)>)$\g){" + n + "}"), function(x){return x.replace(RegExp("((<SUNDAY(\s*)\/(\s*)>)$\g)" + "$"), "HHHH")}))

Ожидаемый результат:

Мы заменяем второе вхождение

`<SUNDAY with HHHH.`

Таким образом, вывод будет:

<?xml version="1.0" encoding="utf-8"?>
        <RecipeData>
        <SUNDAY Value="1"/>
        <HHHHH/>
        <SUNDAY/>
        <SUNDAY/>
        <MONDAY Value="1"/>
        </MONDAY>
        <MONDAY>
        </MONDAY>
        </RecipeData>;

1 Ответ

0 голосов
/ 19 февраля 2020

Один из вариантов - использование DOMParser и, например, подсчет случаев, когда nodeName равно SUNDAY.

Если есть совпадение, замените узел новым узлом через parentNode.

let xmlData = `<?xml version="1.0" encoding="utf-8"?>
    <RecipeData>
    <SUNDAY Value="1"/>
    <SUNDAY/>
    <SUNDAY/>
    <SUNDAY/>
    <MONDAY Value="1">
    </MONDAY>
    <MONDAY>
    </MONDAY>
</RecipeData>`,
  search = 'SUNDAY',
  n = 2;

parser = new DOMParser();
xmlDoc = parser.parseFromString(xmlData, "text/xml");
let childNodes = xmlDoc.documentElement.childNodes;
let nrSundays = 0;

for (let i = 0; i < childNodes.length; i++) {
  if (childNodes[i].nodeName === search) {
    nrSundays++;
    if (nrSundays === n) {
      let childNode = childNodes[i];
      childNode.parentNode.replaceChild(xmlDoc.createElement('HHHHH'), childNode);
    }
  }
}

console.log(new XMLSerializer().serializeToString(xmlDoc.documentElement));

Другим вариантом может быть использование xpath с использованием оценка

let xmlData = `<?xml version="1.0" encoding="utf-8"?>
    <RecipeData>
    <SUNDAY Value="1"/>
    <SUNDAY/>
    <SUNDAY/>
    <SUNDAY/>
    <MONDAY Value="1">
    </MONDAY>
    <MONDAY>
    </MONDAY>
</RecipeData>`,
  search = 'SUNDAY',
  n = 2;

parser = new DOMParser();
xmlDoc = parser.parseFromString(xmlData, "text/xml");
let nodeSunday = xmlDoc.evaluate(`/RecipeData/${search}[${n}]`, xmlDoc.documentElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
nodeSunday.singleNodeValue.parentNode.replaceChild(xmlDoc.createElement('HHHH'), nodeSunday.singleNodeValue);
console.log(new XMLSerializer().serializeToString(xmlDoc.documentElement));

Другой

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