2010-10-23 247 views
1

我有這樣的多行字符串。 Ity擁有換行符。.NET正則表達式多行幫助 - 正則表達式

[Site Url =「http://medportal.domain.edu」Owner =「DOMAIN \ user1」SecondaryOwner =「DOMAIN \ user2」ContentDatabase =「WSS_Content_ $ 1」StorageUsedMB =「0.8」StorageWarningMB =「0」StorageMaxMB =「0」/] [Site Url =「http://medportal.domain.edu/sites/ahSC」Owner =「DOMAIN \ user1」ContentDatabase =「WSS_Content_ahSC」StorageUsedMB =「22.3」StorageWarningMB =「0」StorageMaxMB = 「0」/] [Site Url =「http://medportal.domain.edu/sites/ARCTIC」Owner =「DOMAIN \ user1」ContentDatabase =「WSS_Content_ARCTIC」StorageUsedMB =「0.1」StorageWarningMB =「0」StorageMaxMB =「 0「/]

我需要提取和格式化字符串,看起來像這樣:

stsadm.exe -o deletecontentdb -url「http://medportal.domain.edu」-databasename「WSS_Content_ $ 1」-databaseserver myfixedservername

其中兩個參數是Url和ContentDatabase。

這個模式差不多的作品,但它拿起額外的東西,不能處理多

)\ S(URL =)(?)\ S()\ S(ContentDatabase = )(?)\ S(StorageUsedMB =)(*)

取代:

的Stsadm.exe -o deletecontentdb -url $ {URL} -databasename $ {數據庫名稱} -databaseserver myfixedservername

謝謝你。

回答

1

你目前的模式是貪婪的,比預期的更多的匹配結果取而代之。 「貪婪」意味着.*的使用吞噬量超過了您的預期,因此爲了使其非貪婪,您需要在它後面添加一個?,以便它匹配儘可能少的字符數:.*?

\".*\"這樣的模式是貪婪的,因爲您打算在遇到第一個報價時停止,但它實際上繼續匹配內容,直到它達到字符串中的最後一個報價(如果存在)。非貪婪的解決方案是使用\".+?\"\"[^\"]+\"

嘗試這種模式,而不是:

string pattern = @"\[.+?Url=(?<url>"".+?"").+?ContentDatabase=(?<databasename>"".+?"").+?]"; 
string replacement = "stsadm.exe -o deletecontentdb -url ${url} -databasename ${databasename} -databaseserver myfixedservername"; 
string result = Regex.Replace(input, pattern, replacement); 
Console.WriteLine(result);