регулярное выражение, повторяющее подвыражение - PullRequest
1 голос
/ 15 июня 2010

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

<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 ]

1 голос
/ 15 июня 2010

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

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

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

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

1 голос
/ 15 июня 2010

Вот необходимый вам RegExp:

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

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

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

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

1 голос
/ 15 июня 2010

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

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

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

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

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