.NET regex multiline help - регулярное выражение - PullRequest
1 голос
/ 23 октября 2010

У меня есть такая многострочная строка.У Ity есть переводы строк.

[URL сайта = "http://medportal.domain.edu" Владелец =" DOMAIN \ user1 "SecondaryOwner =" DOMAIN \ user2 "ContentDatabase =" WSS_Content_ $ 1 "StorageUsedMB =" 0.8 "StorageWarningMB =" 0 "StorageMaxMB= "0" /] [Site Url = "http://medportal.domain.edu/sites/ahSC" Владелец =" 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} -dимя_таблицы $ {databasename} -databaseserver myfixedservername

Спасибо.

1 Ответ

1 голос
/ 23 октября 2010

Ваш текущий шаблон является жадным и соответствует больше, чем предполагалось, судя по полученной замене. «Жадный» означает, что использование .* поглощает больше, чем вы предполагали, поэтому, чтобы сделать его не жадным, вам нужно добавить ? после него, чтобы оно соответствовало как можно меньшему количеству символов: .*?.

Шаблон, подобный \".*\", является жадным, потому что вы намереваетесь остановиться на первой найденной кавычке, но он фактически продолжает сопоставлять содержимое, пока не достигнет последней кавычки в строке, если она существует. Нежадным решением является использование \".+?\" или \"[^\"]+\".

Попробуйте этот шаблон вместо:

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