2010-10-23 24 views
1

J'ai une chaîne multiligne comme celle-ci. Ity a des sauts de ligne..NET multi-ligne d'aide regex - expression régulière

[Url du site = "http://medportal.domain.edu" Propriétaire = "DOMAIN \ de" SecondaryOwner = "DOMAIN \ utilisateur2 de" ContentDatabase = "WSS_Content_ $ 1" StorageUsedMB = "0.8" StorageWarningMB = "0" StorageMaxMB = "0" /] [Site Url = "http://medportal.domain.edu/sites/ahSC" Propriétaire = "DOMAINE \ utilisateur1" ContentDatabase = "WSS_Content_ahSC" StorageUsedMB = "22.3" StorageWarningMB = "0" StorageMaxMB = "0" /] [Site Url = "http://medportal.domain.edu/sites/ARCTIC" Propriétaire = "DOMAINE \ utilisateur1" ContentDatabase = "WSS_Content_ARCTIC" StorageUsedMB = "0.1" StorageWarningMB = "0" StorageMaxMB = " 0" /]

je dois extraire et formater des chaînes qui ressemblent à ceci:

stsadm.exe -o deletecontentdb -url "http://medportal.domain.edu" -databasename "WSS_Content_ $ 1" -databaseserver monfixedservername

Lorsque les deux arguments sont Url et ContentDatabase.

Ce modèle presque fonctionne mais il ramasse des choses supplémentaires et ne peut pas gérer multiligne

(. ) \ s (URL =) ( ?.) \ s (. ) \ s (= ContentDatabase) ( ?.) \ s (StorageUsedMB =) (*)

remplacerons:.

stsadm.exe -o deletecontentdb -url $ {url} -databasename $ {} databasename -databaseserver myfixedservername

Remerciements toi.

Répondre

1

Votre motif actuel est gourmand et correspond plus que prévu à la suite du remplacement qui en résulte. "Greedy" signifie que l'utilisation de .* est engloutit plus que vous ne le souhaitez, donc pour le rendre non-gourmand, vous devez ajouter un ? après cela afin qu'il corresponde au moins de caractères possible: .*?. Un modèle comme \".*\" est gourmand parce que vous avez l'intention de s'arrêter à la première citation rencontrée, mais il continue à faire correspondre le contenu jusqu'à ce qu'il atteigne la citation finale dans la chaîne, s'il en existe une. La solution non-gourmande consiste à utiliser \".+?\" ou \"[^\"]+\".

Essayez ce modèle à la place:

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);