2010-10-23 147 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);