У меня есть следующий текст

<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)*)+)+
}

Сопоставляется с активным шаблоном и совпадает с ошибочным утверждением и успешным отчетом соответственно.

Теперь с дополнительной информацией, какой подход я должен выбрать? Большое спасибо за помощь. :)

изменить конец

1
Michael Z 15 Июн 2010 в 07:36

3 ответа

Лучший ответ

Вот RegExp вам нужно:

<(pattern|failed)\b[^>]*(?:/>|>[^<]*</\1>)

Просто избегайте косой черты при использовании в нотации регулярного выражения Javascript:

var regExp = /<(pattern|failed)\b[^>]*(?:\/>|>[^<]*<\/\1>)/gi;
var matchesArray = testString.match(regExp);

Это регулярное выражение найдет целые теги и , если они являются пустыми тегами или нет ( или ). Также рассматриваются возможные атрибуты элемента.

1
smnh 15 Июн 2010 в 12:41

Вы можете использовать регулярное выражение "|" оператор (что означает «или») для создания регулярного выражения, которое будет соответствовать одному или нескольким выражениям. Например ...

/^<failed>[\w|\W]*?<\/failed>|^<pattern[^>]*>/

... должен делать то, что вы просите (основываясь на примере, который вы дали выше).

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

1
broofa 15 Июн 2010 в 04:54

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

  • Ваши требования могут измениться в будущем, делая ваше регулярное выражение все более громоздким
  • Вы анализируете данные из стороннего источника, который может содержать что угодно, включая строки, похожие на теги XML, встроенные в комментарии XML, разделы или атрибуты CDATA.

См. этот ответ для получения информации о синтаксическом анализе XML в Javascript.

Простое решение - использовать jQuery. Если по какой-то причине вы не хотите загружать jQuery для этого, то начните здесь .

1
Community 23 Май 2017 в 11:48