我已经搜索过,但我不知道我是怎么做错的。我正在尝试获取"图像名称"来自每个"块"在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
没有帮助。帮帮我正则表达式奇才!我为此创建了一个帐户。当然,我可以抓取整个图像列表,拆分换行符然后清理字符串数组,但我很乐意在正则表达式中为科学做这一切!
答案 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();