У меня есть следующий текст
<pattern name="pattern1"/>
<success>success case 1</success>
<failed> failure 1</failed>
<failed> failure 2</failed>
<unknown> unknown </unknown>
<pattern name="pattern4"/>
<pattern name="pattern5"/>
<success>success case 3</success>
<pattern name="pattern2"/>
<success>success case 2</success>
<otherTag>There are many other tags.</otherTag>
<failed> failure 3</failed>
<pattern name="pattern3"/>
<unknown>unkown</unknown>
А регулярное выражение <failed>[\w|\W]*?</failed>
соответствует всем строкам и содержит ошибочный тег.
Что мне нужно сделать, если я хочу, чтобы все неудачные теги и тег шаблона были выше неудачного тега. если под тегом шаблона нет сбойного тега, то тег шаблона не должен совпадать? В основном, я хочу следующий вывод:
<pattern name="pattern1"/>
<failed> failure 1</failed>
<failed> failure 2</failed>
<pattern name="pattern2"/>
<failed> failure 3</failed>
Я делаю это в JavaScript, я не против сделать некоторые промежуточные шаги.
изменить начало Почти все респонденты предлагают мне другой подход. Я не уверен, какой подход я должен использовать. JQuery, регулярное выражение или другие. Я даю больше информации здесь для лучшего принятия решений. Формат данных будет меняться, но не будет часто меняться. Данные взяты из отчета о проверке схематрона типа файла ".SVRL". Структура файла имеет следующую схему, определенную с использованием "компактный синтаксис RELAX NG"
schematron-output = element schematron-output {
attribute title { text }?,
attribute phase { xsd:NMTOKEN }?,
attribute schemaVersion { text }?,
human-text*,
ns-prefix-in-attribute-values*,
(active-pattern,
(fired-rule, (failed-assert | successful-report)*)+)+
}
Сопоставляется с активным шаблоном и совпадает с ошибочным утверждением и успешным отчетом соответственно.
Теперь с дополнительной информацией, какой подход я должен выбрать? Большое спасибо за помощь. :)
изменить конец
3 ответа
Вот RegExp вам нужно:
<(pattern|failed)\b[^>]*(?:/>|>[^<]*</\1>)
Просто избегайте косой черты при использовании в нотации регулярного выражения Javascript:
var regExp = /<(pattern|failed)\b[^>]*(?:\/>|>[^<]*<\/\1>)/gi;
var matchesArray = testString.match(regExp);
Это регулярное выражение найдет целые теги
Вы можете использовать регулярное выражение "|" оператор (что означает «или») для создания регулярного выражения, которое будет соответствовать одному или нескольким выражениям. Например ...
/^<failed>[\w|\W]*?<\/failed>|^<pattern[^>]*>/
... должен делать то, что вы просите (основываясь на примере, который вы дали выше).
Но, как говорили другие комментаторы, анализ XML с помощью регулярных выражений - это скользкий путь. Возможно, вы захотите посмотреть другие варианты, например, использовать класс DocumentFragment для анализа вашей строки.
Вы должны изучить методы, отличные от регулярных выражений, для разбора XML, особенно если:
- Ваши требования могут измениться в будущем, делая ваше регулярное выражение все более громоздким
- Вы анализируете данные из стороннего источника, который может содержать что угодно, включая строки, похожие на теги XML, встроенные в комментарии XML, разделы или атрибуты CDATA.
См. этот ответ для получения информации о синтаксическом анализе XML в Javascript.
Простое решение - использовать jQuery. Если по какой-то причине вы не хотите загружать jQuery для этого, то начните здесь .
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.