2010-06-15 46 views
1

我有以下文字正則表達式重複子表達式

<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這樣做,我不介意做一些中間步驟。

編輯開始 幾乎所有repliers建議我採取不同的方法。我不確定我應該採取哪種方法。 JQuery,正則表達式或其他。爲了做出更好的決策,我在此提供更多信息。數據格式會改變,但不會經常改變。該數據是從文件類型「.SVRL」的Schematron的validition報告的文件的結構是在使用‘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)*)+)+ 
} 

映射到主動模式中定義的以下架構,並且匹配失敗斷言和成功報告。

現在有了更多的信息,我應該採取哪種方法? 非常感謝您的幫助。 :)

編輯結束

+0

請參閱[RegEx匹配除XHTML自包含標記以外的開放標記](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)和[XML用JavaScript解析](http://stackoverflow.com/questions/649614/xml-parsing-in-javascript)。大多數JavaScript環境都很好地支持XML解析。你不想使用正則表達式。 – 2010-06-15 03:37:58

+0

在附註中,'|'並不是指字符類中的「或」,它只是匹配'|'。無論如何,「或」都隱含在角色類中; '[\ w \ W]'表示「一個字符或一個非字符」。 – 2010-06-15 05:06:03

+0

@Matthew:非常感謝您的建議,我會評估您的選擇。 @Alan:非常感謝您指出「|」在角色類中並不意味着「或」。 :) – 2010-06-15 21:17:33

回答

1

這裏有您需要的正則表達式:

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

這個正則表達式會發現整個<模式>和<失敗>:

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

使用JavaScript正則表達式的符號時,就難逃斜槓標籤,要麼是空標籤(<空/ >或<不空標籤> </notEmpty >)。它還考慮可能的元素屬性。

+0

嗨smnh,對不起,我稍微編輯了我的問題,你的正則表達式對我的原始需求非常適用,你有任何機會可以解析新文本? – 2010-06-16 00:04:16

1

你應該看看比正則表達式等來解析XML,方法尤其是:

  • 你的要求有可能在將來改變,使你的常規表達越來越不自信
  • 您正在解析來自第三方來源的數據,該數據可能包含任何內容,包括看起來像嵌入在XML註釋中的XML標籤的字符串,CDATA se文字或屬性。

請參閱this answer瞭解有關Javascript中的XML解析的信息。

簡單的解決方案是「使用jQuery」。如果由於某種原因你不想加載jQuery來做到這一點,那麼start here

1

你可以使用正則表達式「|」運算符(意​​思是「或」)來創建一個匹配一個或多個表達式的正則表達式。例如...

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

...應該做你在問什麼(根據你上面給出的例子)。

但是,正如其他評論者所說,使用正則表達式解析XML是一個滑坡。您可能會想要查看其他選項,例如使用DocumentFragment類爲您解析字符串。

+0

感謝broofa,你的回答完全按照我的意願。我瞭解別人的關注,但文件結構在未來不太可能改變(我增加了更多評論)。我傾向於使用正則表達式。 – 2010-06-15 21:09:52

+0

嗨broofa,對不起,我稍微編輯了我的問題,你的正則表達式對我的原始需求非常適用,任何你可以在新文本中解析的機會? – 2010-06-16 00:04:32