嗨,我是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 :(得分: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);
}
}