2013-07-24 52 views
1

我想从C# 基本上使用正则表达式一个JCL源提取一些信息,这是一个字符串,我可以有:匹配多行&IgnoreSome

//JOBNAME0 JOB (BLABLABLA),'SOME TEXT',MSGCLASS=YES,ILIKE=POTATOES, GRMBL 
//    IALSOLIKE=TOMATOES,  ANOTHER GARBAGE 
//    FINALLY=BYE 
//OTHER STUFF 

所以我需要提取作业名JOBNAME0,信息(BLABLABLA),描述'SOME TEXT'和其他参数MSGCLASS=YESILIKE=POTATOESIALSOLIKE=TOMATOESFINALLY=BYE

我必须忽略一切有空间后...像GRMBLANOTHER GARBAGE

我必须继续下一行,如果我的最后一个有效字符是一个,停止,如果什么都没有。

到目前为止,我已经成功地设法获得了工作名称,信息和描述,非常简单。对于其他帕姆斯,我能够得到所有的帕尔姆并将它们分开,但我不知道如何摆脱垃圾。

这里是我的代码:

var regex = "//([^\\s]*) JOB (\\([^)]*\\))?,?(\\'[^']*\\')?,?([^,]*[,|\\s|$])*"; 
Match match2 = Regex.Match(test5, regex,RegexOptions.Singleline); 

string CarteJob2 = match2.Groups[0].Value; 
string JobName2 = match2.Groups[1].Value; 
string JobInfo2 = match2.Groups[2].Value; 
string JobDesc2 = match2.Groups[3].Value; 
IEnumerable<string> parms = match2.Groups[4].Captures.OfType<Capture>().Select(x => x.Value); 
string JobParms2 = String.Join("|", parms); 

Console.WriteLine(CarteJob2 + "|"); 
Console.WriteLine(JobName2 + "|"); 
Console.WriteLine(JobInfo2 + "|"); 
Console.WriteLine(JobDesc2 + "|"); 
Console.WriteLine(JobParms2 + "|"); 

输出我得到的是这样一个:

//JOBNAME0 JOB (BLABLABLA),'SOME TEXT',MSGCLASS=YES,ILIKE=POTATOES, GRMBL 
//    IALSOLIKE=TOMATOES,  ANOTHER GARBAGE 
//    FINALLY=BYE 
//OTHER | 
JOBNAME0| 
(BLABLABLA)| 
'SOME TEXT'| 
MSGCLASS=YES,|ILIKE=POTATOES,| GRMBL 
//    IALSOLIKE=TOMATOES,|  ANOTHER GARBAGE 
//    FINALLY=BYE 
//OTHER | 

我想看到的输出是:

//JOBNAME0 JOB (BLABLABLA),'SOME TEXT',MSGCLASS=YES,ILIKE=POTATOES, GRMBL 
//    IALSOLIKE=TOMATOES,  ANOTHER GARBAGE 
//    FINALLY=BYE| 
JOBNAME0| 
(BLABLABLA)| 
'SOME TEXT'| 
MSGCLASS=YES|ILIKE=POTATOES|IALSOLIKE=TOMATOES|FINALLY=BYE| 

是否有方式得到我想要的?

+0

你有没有考虑过用两个正则表达式来做这件事? – unlimit

回答

1

我想我会试着用两个Regex表达式来做这个。

第一个从字符串开头获取所有起始信息 - 作业名称,信息,说明。

第二个获得所有参数,这些参数都似乎有一个简单的模式<param name>=<param value>

第一Regex可能是这样的:

^//(?<job>[\d\w]+)[ ]+JOB[ ]+\((?<info>[\d\w]+)\),'(?<description>[\d\w ]+)' 

我不知道,如果规则允许空格出现在作业名称,信息或说明 - 根据需要进行调整。另外,我假设这是使用^ char的文件的开头。最后,这个Regex已经定义了组,所以在C#中获取值应该更容易。

第二Regex可能是这样的:

(?<param>[\w\d]+)=(?<value>[\w\d]+) 

同样,分组加入到帮助获取参数的名称和值。

希望这会有所帮助。

编辑:

小提示 - 您可以使用@标志C#中的字符串之前,使其更容易写这样Regex模式。例如:

Regex reg = new Regex(@"(?<param>[\w\d]+)=(?<value>[\w\d]+)");