2011-07-26 39 views
1

編輯 - 由於XML的角度似乎越來越偏離人們,我改變了我正在尋找的字符串。我知道如何使用XML技術,如JAXB和Xpath/XQuery,我想知道是否以及如何使用REGEX這是可能的。正則表達式幫助 - 必須是可能的,我只是不能得到它的工作

這一直使我發瘋。我已經嘗試了很多東西,並且已經接近我想要的東西,但是不能釘住它。

作爲諾迪示例...

從這個串

項ID = 1 a = 1時希望= YES X = 24項ID = 2 A = 1 B = 2通緝= NO y = 25 ITEM id = 3 c = 3 wanted =是x = 25 z = 26

我想獲取每個想要的項目的id = YES。所以在這種情況下的結果將是1和3.

從我所嘗試的,我遇到的問題是阻止我的正則表達式超出當前項目,因爲項目id = 2它使用通緝=是從項目3。我已經嘗試了幾個lookaheads(和後面),但不能得到我想要的。

我也應該注意到,我想這是一個單一的正則表達式。我知道我可以做的事情就像分割出每個項目然後處理想要的=是,但我想知道是否有可能使用單個正則表達式。我從c#(.NET)調用這個正則表達式,所以正則表達式可以使用.NET正則表達式允許的更加花哨的後視鏡,但如果可能的話,我寧願如果它沒有,以便它更便攜。

在此先感謝(它看起來像它應該是簡單的,但我逼瘋),

史蒂夫

回答

1

此正則表達式應該工作(使用負前瞻的「通緝」):

string s = "ITEM id=1 a=1 wanted=YES x=24 ITEM id=2 a=1 b=2 wanted=NO y=25 ITEM id=3 c=3 wanted=YES x=25 z=26"; 

foreach (Match match in Regex.Matches(s, "id=([0-9]+)(.(?!wanted))*.wanted=yes", RegexOptions.IgnoreCase)) 
    Console.WriteLine(match.Groups[1].Value); 

這假定ID總是通緝之前。

+0

太棒了! Thankyou,這是我之後(稍微改變它在我原來的問題中給出的xml-ish字符串)。我的嘗試與此非常接近,似乎我錯過了包圍lookahead的額外(。)集。謝謝。 – steve

5

你不應該使用正則表達式解析XML。這可以使用簡單的XPath來實現。根據您使用的語言,有各種支持XPath的XML庫。

示例XML是無效的,但這裏是一個有效的一個C#示例(使用LINQ到XML):

string s = "<root><item><id>1</id><x><wanted>YES</wanted></x></item><item><id>2</id><x><wanted>NO</wanted></x></item><item><id>3</id><x><wanted>YES</wanted></x></item></root>"; 
var xml = XElement.Parse(s); 

var items = xml.XPathSelectElements("//item[descendant::wanted='YES']"); 

foreach (var item in items) 
    Console.WriteLine((int)item.Element("id")); 
+0

爲什麼人們這樣做?感謝您的建議,但我確實要求提供正則表達式解決方案。說我不應該使用正則表達式的XML是錯誤的!正則表達式用於匹配文本中的模式,這正是我想要做的。如果這恰好是xml那麼就這樣吧。是的,還有其他的方法可以做xml,但是不使用它們可能有很好的理由。其中一個原因可能是我的XML無效(或嚴格的XML),所以這就是爲什麼我想要一個正則表達式的解決方案。 – steve

+1

以及問題是,XML是複雜的,所以如果你想覆蓋所有的情況下,這將是一個巨大的正則表達式,很難閱讀和測試。如果你的文本不是有效的xml,那麼你應該解釋它的結構是什麼 - 你顯然不希望僅僅匹配這個字符串,而是像**這樣的許多**。所以定義**就像**一樣。定義一個簡單的方法就是說它是XML--所以我認爲它是。 –

+0

我現在編輯了該示例以從此問題中移除xml。我感興趣的是如何使用正則表達式來解決這個問題。謝謝。 – steve

0

你不能做到這一點與正則表達式。 XML不是regular language。您將不得不使用一些專門用於解析XML的東西。此頁面上的C#示例可能會幫助你:http://msdn.microsoft.com/en-us/library/cc189056(v=vs.95).aspx#Y586

+0

正則表達式的大部分實現與常規語言不再有關係。他們只是混淆地命名。也就是說,用正則表達式實際解決這個問題仍然是一個壞主意,因爲有更好的工具可用,正如你正確表述的那樣。 – Jens

+0

@Jens他們仍然與正規語言有很多關係。他們可以做更多的事情,但基本上所有的lookahead和lookback都可以讓你通過有限數量的有限狀態機運行你的字符串,而不僅僅是一個有限狀態機。 Perl正則表達式雖然是個例外。它與Perl以外的其他任何東西都沒有關係。 – Paulpro

+0

我現在編輯了該示例以從此問題中刪除xml。我感興趣的是如何使用正則表達式來解決這個問題。謝謝。 – steve