2016-03-06 3 views
-1

Предположим, что я следующий текстовый блок:Извлечение группы чисел в квадратных скобках с использованием регулярных выражений

/HDMAreaCoverageValue CIP3BeginPrivate 
/HDMZones <</HDMInkC [0.000000][0.000002][0.000400][0.006000] 
/HDMInkM [0.006000][0.086000] 
/HDMInkB [0.000000][0.000002][0.000400] 
>> def 

Я пытаюсь извлечь только цифры в скобках - но, с моей нынешней модели, все я получаю являются фигурные скобки. Я сейчас пытаюсь:

Regex ColorValueRegex = new Regex("HDMZones([0-9,]{1,})+>>"); 

Что не так с этим рисунком? Я вижу, что я делаю это извлечения данных \ запятая (или точка) из данных, которые я расскажу позже.

Мой код:

foreach (var data in ValidFiles) 
    { 
     Regex ColorValueRegex = new Regex("HDMZones([0-9,]{1,})+>>"); 
     var RegexAux2 = ColorValueRegex.Match(data); 
     //HDMZonesNumbers.Add(RegexAux2.Groups[1].ToString().Replace("HDMZones <</", "").Replace("<</", "").Replace("/", "")); 
     string pattern = @"([\d]+[,.]{0,1})+"; 
     string NumbersCleaned = Regex.Match(RegexAux2.ToString(), pattern).Value; 
    } 

Закомментированный часть, потому что после извлечения я добавлю полученную строку в списке. Я ожидаю, чтобы извлечь строку, как:

[0.000000][0.000002][0.000400][0.006000][0.006000][0.086000] 

я уже пытался использовать много примеров, представленных из StackOverflow, но ни один из «эм не сделал то, что мне нужно. Прежде чем писать этот код, я работал, но был внутри мега-петли foreach - теперь я обрабатываю данные по отдельности. Любая помощь будет оценена по достоинству. Спасибо

ответ

0

Как я достиг своего результата: я решил разделить запрошенный шаблон в двух регулярных выражениях. Один для просто извлечения чисел с некоторым текстом на нем, а другой для получения чисел внутри квадратных скобок (скобки входят). Затем, позже, я заменил [с пробелом и] с разделителем | таким образом я могу разделить на массив и выполнить некоторые операции, которые мне понадобятся. код следующим образом:

public void ColorValueExtraction()//Processing all colors values 
{ 
    StringBuilder sb = new StringBuilder(); //Creating a StringBuilder object to append later 
    string ColorsWithBrackets = string.Empty; 
    foreach (var data in ValidFiles) //data means a file - lots of text 
    { 

     Regex ValuesRegex = new Regex("HDMZones(.*)>>"); //Extracting only content between HDMZones and >> 
     var RegexAux2 = ValuesRegex.Match(data); //Match my pattern on data 
     ColorsWithBrackets = RegexAux2.Groups[1].ToString(); 
     ColorsWithBrackets = ColorsWithBrackets.Replace("HDMZones <</", "").Replace("<</", "").Replace("/", ""); //Replacing a few things 

     var pattern = @"\[(.*?)\]"; //Extract numbers and brackets only 
     var query = ColorsWithBrackets; 

     var matches = Regex.Matches(query, pattern); 
     foreach (Match m in matches) //Looping on matches ,numbers found 
     {     
      string aux2 = string.Empty; //auxiliar string 
      aux2 = m.Groups[1].ToString();//auxiliar string receives the match to string 
      aux2 = Regex.Replace(aux2, @"\s+", "|"); //replacing all spaces with | , to be used as delimiter in other method    
      sb.Append(aux2); //each iteration appends to StringBuilder aux2 - so, in the end, sb will have all numbers from the respective file          
     }    
     HDMZonesNumbersLst.Add(sb.ToString()); //Adding each collection of numbers to a position in the list 
    }   
} 
1

Если вы только пытаетесь сопоставить номер, я предлагаю вам использовать следующее регулярное выражение.

Regex:\[[\d.]*\]

Объяснение:

  • Это будет соответствовать digits, dot и square brackets [] и вернуть его в матче.

Regex101 Demo

+0

Понял, но мой компилятор дает мне «непризнанный последовательность» на обратной косой черты. Ваш пример - это php. –

+1

Я не владею строковыми функциями 'C#'. Попробуйте двойную косую черту '\\ d',' \\ ['или' \\] '. Хит и испытание :-) –

+2

Я сделал небольшой тест и выглядит так: \ [\ d {1,}. \ D {1,} \] работает, я нашел полезным изучить регулярное выражение в C# this free e -book http://www.syncfusion.com/resources/techportal/details/ebooks/regularexpressions –

1

Попробуйте это в C#:

Regex ColorValueRegex = new Regex(@"\[[0-9\.]+\]"); 

Это дает ответ, который вы хотите.

+0

Это даст мне ответ только в фигурных скобках. {}. Нет совпадений. Я верю, потому что числа, которые я ищу, находятся в середине какого-то текста. –

+0

Как это возможно? В тексте нет фигурных фигурных скобок! –

+0

Это происходит потому, что совпадений не найдено. При отладке и анализе результатов не работало.Я опубликовал только часть текста ввода, но важная часть. Я отредактирую вопрос и добавлю все –

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