我有以下文字
<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。
现在有了额外的信息,我应该采取哪种方法? 非常感谢您的帮助。 :)
编辑结束
答案 0 :(得分:1)
您应该研究正则表达式以外的方法来解析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;)。它还考虑了可能的元素属性。