2012-06-01 4 views
2

Мне нужно проанализировать довольно сложную строку для «оценки» функций, содержащихся в строке. У меня есть только одна функция, чтобы «извлечь», и она имеет эту специфическую синтаксисом:Небольшая помощь по RegEx

LOC_POS(number;number); 

Эта строка содержится в HTML-страницы, как это:

something here LOC_POS(45;9);Some string or html content <br> here LOC_POS(45.21312;9.1232123);LOC_POS(45,32;9,12); some other string... 

(номера координаты и функция признается по этой RegEx:

LOC_POS\([ 0-9.,]+;[ 0-9.,]+\); 

Как я могу извлечь все блоки в C# результат Я хочу иметь массив, содержащий (одна строка за единицу)

something here 
LOC_POS(45;9); 
Some string or html content <br> here 
LOC_POS(45.21312;9.1232123); 
LOC_POS(45,32;9,12); 
some other string... 

Я знаю, как сделать это с обычной строкой разбором ..

+0

это лучшая задача для более гибкого и ориентированного на строку языка Perl, поэтому: split/pattern /, $ yourstring. – gaussblurinc

+0

Вы можете использовать другой язык для этой задачи? – gaussblurinc

+0

@loldop Почему? C# имеет регулярное выражение, не так ли? –

ответ

1

вот что я придумал.

 string str = @"something here LOC_POS(45;9);Some string or html content <br> here LOC_POS(45.21312;9.1232123);LOC_POS(45,32;9,12); some other string..."; 
     Regex test = new Regex(@"(LOC_POS\([\d\.,]+;[\d\.,]+\);)"); 
     string[] segments = test.Split(str); 
     StringBuilder sb = new StringBuilder(); 
     foreach (string s in segments) 
      if(!String.IsNullOrEmpty(s)) 
       sb.AppendLine(s); 
     textBox1.Text = sb.ToString(); 

выходные результаты

something here 
LOC_POS(45;9); 
Some string or html content <br> here 
LOC_POS(45.21312;9.1232123); 
LOC_POS(45,32;9,12); 
some other string... 

Регулярное выражение находит каждый экземпляр LOC_POS, раскол вызывает его, чтобы разбить строку на ее сегменты, то восстановить строку с помощью StringBuilder, чтобы получить все newLines в нужном месте. Вы также можете использовать это для захвата отдельных экземпляров блока LOC, если они вам действительно нужны. Группа захвата вокруг всего заключается в том, чтобы убедиться, что блоки LOC фактически расположены, а не игнорируются.

+0

работает отлично. Я изменил регулярное выражение, чтобы он соответствовал другой функции, но он работает! – AndreaCi

+0

вам следует «принять» ответ, и, к счастью, я мог бы помочь = D – Nevyn

-1
var content = "...."; 
var regex = new Regex(@"LOC_POS\([ 0-9.,]+;[ 0-9.,]+\);"); 
var matches = regex.Match(content); 
+0

Это не отвечает на вопрос и не дает никаких объяснений. – kevlar1818

+0

Нет, он дает только первый loc_pos как результат – AndreaCi

0

((.*?)(LOC_POS\([\d\.,]+;[\d\.,]+\);))

Это будет захватывать несколько групп. Первой подгруппой будет строка перед LOC_POS. Regexr here.

Группа 1: полная строка

Группа 2: строка перед LOC_POS

Группа 3: LOC_POS называют

+0

, если он имеет последовательность LOC_POS? это регулярное выражение слишком много. – gaussblurinc

+0

Да, это только захватит то, что следует за LOC_POS. –

+0

Нет, я ожидаю 6 групп .. но у меня всего 3 ..полная строка (дважды) и строка перед loc_pos – AndreaCi

0

Как об этом:

string str = @"something here LOC_POS(45;9);Some string or html content <br> here LOC_POS(45.21312;9.1232123);LOC_POS(45,32;9,12); some other string..."; 
string rgx = @"\s*(LOC_POS\([ 0-9.,]+;[ 0-9.,]+\);)\s*"; 

str = Regex.Replace(str, rgx, @"##$1##"); 
//Console.WriteLine("str= " + str); 

string[] lines = str.Split(new string[] {"##"}, StringSplitOptions.RemoveEmptyEntries); 

foreach(string s in lines) { 
    Console.WriteLine(s); 
} 
Console.ReadKey(); 

Сначала я положил произвольное разделение -sequence (я использовал ##, но вы можете изменить его на что угодно) вокруг элементов LOC_POS (используя ваше регулярное выражение h whitespace catching). Затем я разделяю строку на указанной последовательности split, следя за тем, чтобы обрабатывать пустые записи. Бум, сделано.

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