多线组Regex c#

时间:2011-12-14 15:01:54

标签: c# regex

我已经搜索过,但我不知道我是怎么做错的。我正在尝试获取"图像名称"来自每个"块"在c#中使用Regex的文本文件中。这是文本的样子:

begin block Block_test
  LowFlight_005_001  strip_id 5
  LowFlight_005_002  strip_id 5
  LowFlight_006_005  strip_id 6
  LowFlight_006_004  strip_id 6
  LowFlight_006_003  strip_id 6
  LowFlight_006_002  strip_id 6
  LowFlight_006_001  strip_id 6
  LowFlight_007_001  strip_id 7
  LowFlight_007_002  strip_id 7
  LowFlight_007_003  strip_id 7
  LowFlight_007_004  strip_id 7
  LowFlight_007_005  strip_id 7
  LowFlight_007_011  strip_id 7
  LowFlight_007_012  strip_id 7
  LowFlight_007_013  strip_id 7
  LowFlight_007_014  strip_id 7
end block

使用此正则表达式:

begin block Block_test\n(  (?<image>.*?)  (.*?\n))*end block

BUT!命名的组图像始终只是最后一个图像,即LowFlight_007_014。如何从每一行中选择图像。我尝试过使用多行标志,插入行的开头和结尾如下:

begin block Block_test\n(^  (?<image>.*?)  (.*?$\n))*end block

没有帮助。帮帮我正则表达式奇才!我为此创建了一个帐户。当然,我可以抓取整个图像列表,拆分换行符然后清理字符串数组,但我很乐意在正则表达式中为科学做这一切!

3 个答案:

答案 0 :(得分:1)

如果您不需要担心文件中的其他行或多个块,我能想到的最简单的正则表达式是:

new Regex(@"  (?<image>\w*)  ");

将捕获多个匹配,每个匹配一个“图像”组。

如果你必须考虑一个输入中的多个块,我怀疑你需要使用多个正则表达式,分成块,然后找到图像。

如果你只需要找到块内线条的图像,那么你的答案似乎在你的评论中:

begin block Block_test\r\n(  (?<image>.*?) (.*\r\n))*end block 

虽然您可以考虑使用\ w:

begin block Block_test\r\n(  (?<image>\w*) (.*\r\n))*end block 

答案 1 :(得分:0)

试试这个:

begin block Block_test(?'body'.*?)end block

在指定的gropu“body”中捕获测试,但请记住指定RegexOptions.SingleLine。 即使使用SingleLine选项,您也可以使用:

begin block Block_test(\s+\S+\s+\S+\s\d)+

对每个区块进行捕获。

答案 2 :(得分:0)

我会拆分这个任务,这个怎么样

String Block = "Begin block Block_test\n" +
" LowFlight_005_001  strip_id 5\n" +
" LowFlight_005_002  strip_id 5\n" +
" LowFlight_006_005  strip_id 6\n" +
" LowFlight_006_004  strip_id 6\n" +
" LowFlight_006_003  strip_id 6\n" +
" LowFlight_006_002  strip_id 6\n" +
" LowFlight_006_001  strip_id 6\n" +
"end block";

String[] lines = Regex.Split(Block, @"[\r\n]+");
Regex reg = new Regex(@"^\s*(?<image>.*?)\s+(.*?$)");

foreach (String item in lines) {
    if (!(item.StartsWith("Begin") || item.StartsWith("end"))) {
        Console.WriteLine(item);
        Match result = reg.Match(item);
        Console.WriteLine(result.Groups["image"]);
    }
}
Console.ReadLine();