2012-06-01 43 views
2

我不得不解析一个相当复杂的字符串来“评估”包含在字符串中的函数。我只有一个功能,“提取”,它具有这个特定sintax:正则表达式的帮助不大

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

(数字坐标和功能认识这个正则表达式:

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

首先,我把一个任意分割序列(我使用##,但您可以将其更改为任何内容)围绕LOC_POS元素(使用您的正则表达式h空白捕捉)。然后我将字符串分割到所述分割序列上,确保处理空的条目。繁荣,完成。