匹配多行&;忽略某些

本文关键字:amp | 更新日期: 2023-09-27 18:24:29

我正试图使用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

若最后一个有效字符是,,我必须继续到下一行,若并没有,我必须停止。

到目前为止,我已经成功地获得了工作名称,信息和描述,非常容易。对于其他的parm,我可以得到所有的parm并将它们分开,但我不知道如何处理垃圾。

这是我的代码:

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|

有办法得到我想要的吗?

匹配多行&;忽略某些

我想我应该尝试用两个Regex表达式来实现这一点。

第一个从字符串开头获取所有起始信息的字符串-作业名称、信息、描述。

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

第一个Regex可能看起来像这样:

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

我不知道规则是否允许空白出现在工作名称、信息或描述中——根据需要进行调整。此外,我假设这是使用^字符的文件的开头。最后,这个Regex已经定义了组,所以在C#中获取值应该更容易。

第二个Regex可能是这样的:

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

再次添加分组以帮助获取参数名称和值。

希望这能有所帮助。

编辑:

一个小提示-您可以在C#中的字符串之前使用@符号,这样可以更容易地编写此类Regex模式。例如:

Regex reg = new Regex(@"(?<param>['w'd]+)=(?<value>['w'd]+)");
相关文章:
  • 没有找到相关文章