2010-03-17 47 views
1

我對我的正則表達式結果感到有點困惑(並且仍然試圖讓我的頭部圍繞語法)。我一直在使用http://regexpal.com/來測試我的表達,以及它在那裏的工作,但是在C#中它並不如預期。.Net中的LookAhead正則表達式 - 意想不到的結果

下面是測試 - 下面的表達式:(?=<open>).*?(?=</open>)

上的輸入字符串: <open>Text 1 </open>Text 2 <open>Text 3 </open>Text 4 <open>Text 5 </open>

我希望結果回來的<open>Text1 <open>Text 2 <open>Text 3...

然而,當我這樣做在C#中它只返回第一個匹配<open>Text1

如何從正則表達式返回所有五個「結果」?

Regex exx = new Regex("(?=<open>).*?(?=</open>)", RegexOptions.IgnoreCase | RegexOptions.Singleline); 
    string input = "<open>Text 1</open> Text 2 <open> Text 3 </open> Text 4 <open> Text 5 </open>"; 
    string result = Regex.Match(input, exx.ToString(), exx.Options).ToString(); 
+0

我只看到三場比賽。 – Joey 2010-03-17 10:49:15

回答

1

使用Regex.Matches而不是Regex.Match

PS Home:> $s = '<open>Text 1 </open>Text 2 <open>Text 3 </open>Text 4 <open>Text 5 </open>' 
PS Home:> $re = '(?=<open>).*?(?=</open>)' 
PS Home:> @([regex]::Match($s, $re)).Length 
1 
PS Home:> @([regex]::Matches($s, $re)).Length 
3 

至於Regex.Match狀態的文檔:

搜索的輸入字符串匹配正則表達式模式並返回第一次出現作爲單個Match對象的子字符串。

而對於Regex.Matches

中搜索一個正則表達式的所有匹配的輸入字符串,並返回所有的成功匹配。

注:你在做什麼在這裏似乎非常錯誤的。如果你正在處理的是XML或類似的語言,那麼請不要使用正則表達式來解析它。你會get mad otherwise與嵌套結構。

+0

哇,這很簡單,謝謝,讓它工作! – AaronM 2010-03-17 10:50:26

+0

在這種情況下,你可以通過upvoting和接受約翰內斯的回答來改善業力(請參閱這篇文章旁邊的向上三角形和複選框? – 2010-03-17 10:56:49

+0

我錯過了匹配選項。感謝這個鏈接,我正在做一些基本的HTML解析/刮,沒什麼太複雜的(我認爲...)我正在使用一個for循環和逐字節的字符串逐行掃描,但認爲正則表達式會更好(它肯定少了很多代碼!),我有一個好 – AaronM 2010-03-17 11:01:11

0

你真的想在每場比賽開始時有<open>嗎?爲什麼不使用後視?

(?<=<open>).*?(?=</open>) 
+0

啊,好點。它在我使用的測試數據中看起來很糟糕,但我解析開始標籤的真實數據可能會有所幫助。不過謝謝,Regex對我來說都是新手,但需要一點時間才能習慣。現在Johannes給了我別的東西來看看! – AaronM 2010-03-17 11:12:08