正则表达式重复子表达式

时间:2010-06-15 03:36:47

标签: javascript regex

我有以下文字

<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”的schematron验证报告。文件的结构具有使用“RELAX NG compact syntax”定义的以下模式

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

映射到active-pattern,并分别匹配failed-assert和success-report。

现在有了额外的信息,我应该采取哪种方法? 非常感谢您的帮助。 :)

编辑结束

3 个答案:

答案 0 :(得分:1)

您应该研究正则表达式以外的方法来解析XML,尤其是在以下情况下:

  • 您的要求将来可能会发生变化,使您的正则表达越来越不合适
  • 您正在解析来自第三方源的数据,该源可能包含任何内容,包括看起来像XML注释,CDATA部分或属性中嵌入的XML标记的字符串。

有关使用Javascript进行XML解析的信息,请参阅this answer

简单的解决方案是“使用jQuery”。如果由于某种原因你不想加载jQuery来执行此操作,那么start here

答案 1 :(得分:1)

你可以使用正则表达式“|” operator(意为“或”)创建一个匹配一个或多个表达式的正则表达式。例如......

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

...应该做你要问的事情(基于你上面给出的例子)。

但是,正如其他评论者所说,用正则表达式解析XML是一个滑坡。您可能希望查看其他选项,例如使用DocumentFragment类为您解析字符串。

答案 2 :(得分:1)

以下是您需要的RegExp:

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

使用Javascript正则表达式表示法时,只需转义斜杠:

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

这个正则表达式将找到整个&lt; pattern&gt;和&lt;失败&gt;标签,如果它们是空标签(&lt; empty /&gt;或&lt; notEmpty&gt;&lt; / notEmpty&gt;)。它还考虑了可能的元素属性。