匹配Multiline& IgnoreSome

时间:2013-07-24 02:40:51

标签: c# regex

我正在尝试使用C#中的regex从JCL源中提取一些信息 基本上,这是我可以拥有的字符串:

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

所以我需要提取作业名JOBNAME0,信息(BLABLABLA),说明'SOME TEXT'和其他参与MSGCLASS=YES ILIKE=POTATOES IALSOLIKE=TOMATOES FINALLY=BYE

我必须忽略空间之后的所有内容......例如GRMBLANOTHER GARBAGE

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

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

这是我的代码:

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|

有没有办法得到我想要的东西?

1 个答案:

答案 0 :(得分: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]+)");