Регулярное выражение: Javascript, XML, строка - PullRequest
0 голосов
/ 30 января 2020

У меня есть следующие данные в переменной.

<ctx>
  <PostCode>XXXXXX</PostCode>
  <Title1>Mr</Title1>
  <Name>John</Name>
  <Order1>£100.00</Order1>
  <Order2>£100.01</Order2>
  <Date>10/10/2010</Date
</ctx>

Используя следующее регулярное выражение var payload = ctx.toString().match(/Order[1-9]/g); Я получаю следующие результаты

Order1, Order1, Order2, Order2

Как сделать так, чтобы это останавливалось на Order1, Order2, как и подсчет второго закрывающего тега, также я не могу использовать <Order[1-9]> (открывающий тег), так как мое приложение не позволяет мне захватывать теги <>. В основном регулярное выражение, которое возвращает уникальные значения.

Таким образом, следующее регулярное выражение работает в некоторой степени. (Order[0-9])(?!.*\1) (Order[0-9])(?!.*\1)

https://regex101.com/r/6QhFBg/1

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Никогда не анализируйте XML с регулярным выражением. Неправильный инструмент для работы - приводит к хрупким решениям.

Вместо этого используйте настоящий XML синтаксический анализатор или XPath.

Например, этот XPath

//*[starts-with(local-name(), 'Order')]

будет надежно выбирать все элементы, имя которых начинается с "Order".

В браузере JavaScript выражения XPath оцениваются с помощью document.evaluate:

var orders = document.evaluate('//Order[starts-with(local-name(), 'Order')]', document, 
                               null, XPathResult.ANY_TYPE, null );
var thisOrder = orders.iterateNext();

while (thisOrder) {
  console.log(thisOrder.textContent);
  thisOrder = orders.iterateNext();
}

См. Также Как использовать document.evaluate () и XPath для получить список элементов?

Для синтаксического анализа XML, хранящегося в строке, см., например:

1 голос
/ 30 января 2020

let ctx = 
`<ctx>
  <PostCode>XXXXXX</PostCode>
  <Title1>Mr</Title1>
  <Name>John</Name>
  <Order1>£100.00</Order1>
  <Order2>£100.01</Order2>
  <Date>10/10/2010</Date
</ctx>`;

let payload = ctx
  .match(/<Order[1-9]>/g) // e.g. <Order1>
  .map(o => o.substring(1, o.length - 1)); // trim first char `<` and last char `>`

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