2013-07-12 71 views
0

輸入: 垃圾= 「stff」,啓動1 = 「allshortsofCharactersExceptDoubleQuotes」,START2 = 「* & ^%$ blahblah」正則表達式的回顧後,接着先行

期望的結果: allshortsofCharactersExceptDoubleQuotes

* & ^% $ blahblah

使用C#.NET:

string myRegExString = @"(?<=start[0-9].).*(?="")" 

Yeilds: allshortsofCharactersExceptDoubleQuotes「 START2 =」 * & ^%$ blahblah

通過測試我知道,如果我換成*了一組有除雙引號中的所有字符我會得到想要的結果,但即是。很多工作,我會弄錯的。 。*之前使用(?!「」)或(?!=「」)也不起作用。

那麼,我怎麼讓前瞻停下來找到第一個雙引號?

從反應

正確答案(據我測試過):

(?<=start\d+="")[^""]*(?="") 

OR

(?<=start\d+="")[^""]+(?="") 

或本作品太多,但不太什麼要求。

(?<=start\d+="")[^""]* 

謝謝。我被包裝在這個項目的前瞻性方面。

回答

1

你應該用懶惰量詞.*?這將匹配的少作爲possible..In你的情況.*將盡可能地匹配,因此它能夠捕捉到最後"

(?<=start\d+="").*?(?="") 

你可以得到的名單如使用此代碼

List<string> output=Regex.Matches(input,regex) 
         .Cast<Match>() 
         .Select(x=>x.Value) 
         .ToList(); 
+0

謝謝。將再次嘗試Linq。沒有測試過這個 – frakenweenie

0

用正則表達式的問題是價值觀。*是匹配的文字過多。你可以通過在諸如'。*?'之類的星號之後添加一個問號來讓你的正則表達式變得懶惰。或者你可以改變它以匹配除了雙摺線以外的所有東西:'[^"]*'這是我在這種情況下選擇的。以下應該工作。未測試

string myRegExString = @"(?<=start[0-9].)[^""]*(?="")" 

其他解決方案,我建議是:

string myRegExString = @"(?<=start[0-9].).*?(?="")" 
+0

第一個不會匹配任何東西,因爲你缺少''''在第二個你的結果將包括第一''' – Anirudha

+0

請參閱http:// stackoverflow。com/questions/1928909/in-c-can-i-escape-a-double-quote-in-a-verbatim-string-literal雙引號在字符串lterals中被雙引號轉義 – rbernabe

+0

謝謝!這兩個工作。我被如此包裹在向前看,我看不出明顯的:) – frakenweenie

0

您可以使用此:

@"(?<=start\d="")[^""]+(?="")" 

結果是整個模式。

+1

這將工作,但'(?=「」)'在您的正則表達式中是多餘的 – Anirudha

+1

@Anirudh:是和否,因爲這檢查後有一個雙引號。想象一下這個字符串:'abcd start2 =「abcd',我應該怎麼做? –

+0

謝謝。是的,(?=」「)是多餘的,但是我要求的並且證明可以在需要時使用前瞻。 – frakenweenie