2015-09-10 2 views
1

Правда, я с трудом пишу регулярное выражение строку для разбора что-то в видеРегулярное выражение в регулярном выражении?

[[[tab name=dog content=cat|tab name=dog2 content=cat2]]] 

Это регулярное выражение будет обработан так, что я могу динамически создавать вкладки, как показано здесь. Первоначально я пробовал шаблон регулярного выражения, как \[\[\[tab name=(?'name'.*?) content=(?'content'.*?)\]\]\]

Но я понял, что не смог получить вкладку в целом и основывался на запросе, не делая regex.replace. Можно ли взять всю вкладку, ведущую к символу трубы, в качестве группы, а затем проанализировать эту группу из пар под ключ/значение?

Это текущая строка регулярного выражения Я работаю с \[\[\[(?'tab'tab name=(?'name'.*?) content=(?'content'.*?))\]\]\]

А вот мой код для выполнения регулярных выражений. Любые рекомендации будут оценены.

public override string BeforeParse(string markupText) 
    { 
     if (CompiledRegex.IsMatch(markupText)) 
     { 
      // Replaces the [[[code lang=sql|xxx]]] 
      // with the HTML tags (surrounded with {{{roadkillinternal}}. 
      // As the code is HTML encoded, it doesn't get butchered by the HTML cleaner. 
      MatchCollection matches = CompiledRegex.Matches(markupText); 
      foreach (Match match in matches) 
      { 
       string tabname = match.Groups["name"].Value; 
       string tabcontent = HttpUtility.HtmlEncode(match.Groups["content"].Value); 
       markupText = markupText.Replace(match.Groups["content"].Value, tabcontent); 

       markupText = Regex.Replace(markupText, RegexString, ReplacementPattern, CompiledRegex.Options); 
      } 
     } 

     return markupText; 
    } 
+0

Есть ли в вашем реальном мире данные, которые ваш пример не обеспечивает достаточной сложности? – OmegaMan

ответ

0

Это то, что вы хотите?

string input = "[[[tab name=dog content=cat|tab name=dog2 content=cat2]]]"; 
Regex r = new Regex(@"tab name=([a-z0-9]+) content=([a-z0-9]+)(\||])"); 

foreach (Match m in r.Matches(input)) 
{ 
    Console.WriteLine("{0} : {1}", m.Groups[1].Value, m.Groups[2].Value); 
} 

http://regexr.com/3boot

0

Может String.split будет лучше в этом случае? Например, примерно следующее:

strgin str = "[[[tab name=dog content=cat|tab name=dog2 content=cat2]]]"; 
foreach(var entry in str.Split('|')){ 
var eqBlocks = entry.Split('='); 
var tabName = eqBlocks[1].TrimEnd(" content"); 
var content = eqBlocks[2]; 
} 

Уродливый код, но он должен работать.

0

Просто перегонять шаблон регулярного выражения, вплоть до индивидуальных шаблонов вкладки, такие как name=??? content=??? и матч, который только. Этот шаблон, который сделает каждый Match (два в вашем примере), где данные могут быть извлечены.

string text = @"[[[tab name=dog content=cat|tab name=dog2 content=cat2]]]"; 
string pattern = @"name=(?<Name>[^\s]+)\scontent=(?<Content>[^\s|\]]+)"; 

var result = Regex.Matches(text, pattern) 
        .OfType<Match>() 
        .Select(mt => new 
        { 
         Name = mt.Groups["Name"].Value, 
         Content = mt.Groups["Content"].Value, 
        }); 

В результате перечислимый список с созданными динамическими объектами с закладками, необходимых, которые могут быть непосредственно связаны с управлением:

enter image description here


Примечание в наборе обозначениях [^\s|\]] в труба | рассматривается как литерал в комплекте и не используется как or. Скобка ] должна быть экранирована, хотя ее следует рассматривать как литерал. Наконец, логика анализа будет искать: «В не (^) быть space или pipe или brace для этого набора».

+0

Спасибо за этот ответ, он работал очень хорошо до сих пор. Можете ли вы привести пример того, как вы будете использовать этот результат и использовать его в Regex Replace? – Kyle

+0

@ Kyle, можете ли вы добавить на свой пост, давая до и после того, как должны выглядеть данные?Неясно, было ли проблема первым регулярным выражением или заменой. спасибо – OmegaMan

Смежные вопросы