在两种模式之间匹配正则表达式

时间:2014-02-27 13:23:11

标签: c# regex

嗨,我是RegEx运营的新手。我有一个像

这样的文字
[JUNCTIONS]
;ID                 Elev            Demand          Pattern         
 3                  50              100                                 ;
 4                  50              30                                  ;
 5                  50              20                                  ;
 6                  40              20                                  ;
 7                  50              5                                   ;
 8                  30              5                                   ;
 9                  30              5                                   ;
 2                  50              80                                  ;
 10                 50              70                                  ;
 11                 50              30                                  ;
 12                 50              52                                  ;
 13                 50              40                                  ;
 14                 50              40                                  ;
 15                 50              10                                  ;
 16                 50              10                                  ;
 17                 50              10                                  ;
 18                 0               0                                   ;
 19                 0               0                                   ;

[RESERVOIRS]
;ID                 Head            Pattern         
 1                  100                                 ;

[TANKS]

我想创建一个模式,然后在[JUNCTIONS][RESERVOIRS]之间输出文本,然后[RESERVOIRS][TANKS],然后依此类推。我不知道[XXXX]。我想在[XXX]到[XXX]中找到文字。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

这是正则表达式:

(?=(\[\S+\].*?\[\S+\]))

(?=(\[(?:JUNCTIONS|RESERVOIRS)\].*?\[(?:RESERVOIRS|TANKS)\]))

假设您要处理输入中的所有[...]项内容。

注意:使用确保您正在处理来自c#的多行正则表达式匹配。如果需要,不要逃避\角色。

答案 1 :(得分:1)

以下是一些用于匹配的c#代码,并获得结果。

请务必添加错误检查,例如以确保匹配确实有效。

注意Singleline标志 - 这使得点(。)匹配所有字符,包括换行符。您还可能需要清理和修剪输出,删除任何尾随换行符等。

MatchCollection matches = Regex.Matches(test, @"^\[JUNCTIONS\](.*)\[RESERVOIRS\](.*)\[TANKS\](.*)$", RegexOptions.Singleline);
GroupCollection groups = matches[0].Groups;

// JUNCTIONS text
Console.WriteLine(groups[1]);

// RESERVOIRS text
Console.WriteLine(groups[2]);

修改 - 已更新以匹配OP的更改

如果你想匹配一个未指定数量的比赛,它有点棘手。这个正则表达式将匹配[TEXT]块和它之后的任何内容,直到它成为[字符。使用这个正则表达式的方法是遍历每个区域的MatchCollection,并使用.groups [1]作为文本,使用.groups [2]作为正文。

MatchCollection matches = 
    Regex.Matches(test, @"\[([\w+]+)\]([^\[]+)?", RegexOptions.Singleline);

// for each block / section of the document
foreach(Match match in matches){

     GroupCollection groups = match.Groups;
     // [TEXT] part will be here
     Console.WriteLine(groups[1]);

     // The rest will be here
     Console.WriteLine(groups[2]);

 }

答案 2 :(得分:1)

为什么要使用正则表达式?

假设您可以一次读取一行此输入文本,则可能更快更容易地循环遍历这些行,并输出您需要的行。一些变体:

更新:

回复你的评论如下;您可以使用它来跳过包含[something]的任何行,并打印出其余行:

// Pattern: Any instance of [] with one or more characters of between them:
var pattern = @"\[.+\]"; 
while((line = file.ReadLine()) != null)
{
    if(!Regex.IsMatch(line, pattern)) // Skip lines that match
    {
        Console.WriteLine(line);
    }      
}