JS Regex не работает, как ожидалось. Новая строка не обнаруживается

1

У меня строка следующим образом:

<abc name = "foo">
  <child>bar</child>
</abc>
<xyz>1</xyz>

<abc name = "foo2">
  <child>bar2</child>
</abc>
<xyz>5</xyz>

Я создал регулярное выражение следующим образом:

var regexapi = /<abc\s*name\s*=\s*"(.*?)"[\s\S]*?<\/abc>\n*<xyz>/gim;
while ( (resApi = regexapi.exec(data))) {
    array1.push(resApi[0]);
}
console.log(array1[0]);

Теперь, если у меня нет метки <xyz>1</xyz> array1[0] должен отображаться undefined но он печатает следующим образом:

    <abc name = "foo">
  <child>bar</child>
</abc>

<abc name = "foo2">
  <child>bar2</child>
</abc>
<xyz>

Я думаю, что есть некоторая проблема в \n* поскольку я даю многострочный флаг. Не уверен в этом. Обратите внимание, что это без <xyz>1</xyz>. Я хочу, чтобы он печатался неопределенно. Благодарю.

  • 0
    Что вы на самом деле пытаетесь сделать здесь? Кроме того, регулярное выражение не обязательно лучший инструмент для анализа HTML. На самом деле JavaScript - это HTML-парсер, поэтому вам лучше использовать его для этого вопроса.
  • 0
    Я принимаю XML-файл в качестве входных данных и хочу сохранить значение в <xyz> которое может присутствовать или не присутствовать после <abc> . Если нет, я хочу сохранить значение как неопределенное
Показать ещё 3 комментария

2 ответа

0

Regex:

<\/abc>\n(?:<xyz>(.*)(?=<\/xyz))*

Демо-версия Regex

js Demo

Соответствует </abc> за которым следует <xyz> и значение. если <xyz> отсутствует, array[0] вернет пустую строку (не неопределенную)

  • 1
    Как и все попытки обработки XML с использованием регулярных выражений, это, конечно, неправильно. Например, он не позволяет пробелам появляться в местах, где XML допускает пробелы.
0

Вы бы лучше использовали XML-парсер здесь. Если вы настаиваете на использовании регулярных выражений, вот один из вариантов:

var input = "<abc name = \"foo\">\n\t<child>bar</child>\n</abc>\n<xyz>\n\n<abc name = \"foo2\">\t\n<child>bar2</child>\n</abc>\n<xyz>35</xyz>";
var regex = /<abc[^>]*>(?:(?!<\/abc>)[\s\S]*)<\/abc>\s*<xyz>((?!<xyz>)[\s\S]*)<\/xyz>/g;
var match = regex.exec(input);
console.log(match[1]); // 35

Это соответствует тегу <abc> за которым следуют необязательные пробелы, а затем следует тегом <xyz>. Если этот тег будет пустым, тогда ничто не будет захвачено в первом match[1] группы захвата match[1].

  • 0
    Пробовал это. Но затем, если тег пуст, он захватывает значение в следующем <xyz>
  • 0
    @starkVT Проверьте мой обновленный ответ. Чтобы заставить его работать, мне нужно было добавить еще один негатив, чтобы убедиться, что он не совпадает между тегами <xyz> из разных блоков HTML. Надеюсь, вы поймете, почему регулярные выражения начинают выглядеть не так привлекательно сейчас.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню