2010-04-29 3 views
3
var flashvars = { 
     "client.allow.cross.domain" : "0", 
     "client.notify.cross.domain" : "1", 
}; 

По какой-то странной причине не хотите разобрать этот код (на C#)..NET Regex pattern?

private void parseVariables() { 
     String page; 
     Regex flashVars = new Regex("var flashvars = {(.*?)}", RegexOptions.Multiline | RegexOptions.IgnoreCase); 
     Regex var = new Regex(@"""(.*?)"",", RegexOptions.Multiline | RegexOptions.IgnoreCase); 
     Match flashVarsMatch; 
     MatchCollection matches; 
     String vars = ""; 

     if (!IsLoggedIn) 
     { 
      throw new NotLoggedInException(); 
     } 

     page = Request(URL_CLIENT); 

     flashVarsMatch = flashVars.Match(page); 

     matches = var.Matches(flashVarsMatch.Groups[1].Value); 

     if (matches.Count > 0) 
     { 
     foreach (Match item in matches) 
     { 
      vars += item.Groups[1].Value.Replace("\" : \"", "=") + "&"; 
     } 
    } 
} 
+0

@Scott: просто быть педантичным: C# является языком программирования, который не имеет никакой поддержки регулярных выражений на все (в отличие от JavaScript). OTOH, .NET Framework имеет класс System.Text.RegularExpressions.Regex. –

ответ

5

Использование RegexOptions.SingleLine вместо RegexOptions.Multiline

RegexOptions.Singleline

Определяет режим однострочного. Изменяет значение точки (.), Чтобы он соответствовал каждому символу (вместо каждого символа, кроме \ n).

http://msdn.microsoft.com/en-us/library/443e8hc7(vs.71).aspx

+0

Проблема исправлена. Спасибо vfilby и Макс Shawabkeh. – Scott

2

Необходимо использовать флаг Singleline. В противном случае период не соответствует новым строкам. MultiLine Используется для изготовления ^ и $ матч в начале/конце строк. Кроме того, вы должны экранировать фигурные скобки:

Regex flashVars = new Regex(@"var flashvars = \{(.*?)\}", RegexOptions.Singleline | RegexOptions.IgnoreCase); 
+0

Я не могу найти флаг DotAll, вы уверены, что это действительный RegexOption для C# .NET? – Scott

+0

DotAll известен как одна строка, см. Этот ответ: http://stackoverflow.com/questions/2740176/net-regex-pattern/2740273#2740273. – vfilby

+0

Исправлено. Используется для именования Python. Эквивалент .NET - это «Singleline». –