У меня строка следующим образом:
<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>
. Я хочу, чтобы он печатался неопределенно. Благодарю.
Regex:
<\/abc>\n(?:<xyz>(.*)(?=<\/xyz))*
Соответствует </abc>
за которым следует <xyz>
и значение. если <xyz>
отсутствует, array[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]
.
<xyz>
<xyz>
из разных блоков HTML. Надеюсь, вы поймете, почему регулярные выражения начинают выглядеть не так привлекательно сейчас.
<xyz>
которое может присутствовать или не присутствовать после<abc>
. Если нет, я хочу сохранить значение как неопределенное