2014-02-27 79 views
0

嗨,我是新手在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]。我怎样才能做到这一点?

+0

这是什么格式?纯文本文件?另外:你确定你绝对需要使用正则表达式吗? – Kjartan

回答

1

这里是正则表达式:

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

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

假设你想从你的输入处理所有的事情[...]

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

+0

谢谢,但我无法管理[...]你可以请修改你的帖子,那么它将非常有帮助。 –

+0

我已经更新了正则表达式。如果你在那里需要更多的话,就像我用过的那样用'|'来添加。 –

+0

我已更新我的问题。你能检查一下吗? –

1

这里有一些c#代码来做匹配,并得到结果。

一定要添加错误检查,例如以确保匹配实际工作。

注意单线标志 - 这让点(。)匹配所有字符,包括换行符。你也可能需要清理和调整输出,以消除任何尾随换行符等

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

} 
+0

我编辑了我的帖子...可以请检查 –

+0

确定更新以匹配您的更改 – dtyler

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); 
    }  
} 
+0

我已更新我的问题。你能检查 –

+0

@ ShantanuBanerjee好的,更新了我的答案。希望这更有帮助。 :) – Kjartan