CSharp - 匹配多行 & IgnoreSome

  显示原文与译文双语对照的内容
0 0

我正在尝试从 C# 中使用 正规表达式 中的源提取一些信息,这是一个字符串,我可以:

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

因此我需要提取 jobname JOBNAME0 。信息 (BLABLABLA) 。描述 'SOME TEXT' 和其他版本的MSGCLASS=YESILIKE=POTATOESIALSOLIKE=TOMATOESFINALLY=BYE

我必须忽略在空间后面的一切。 GRMBL 或者 ANOTHER 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|

有什么方法可以得到我想要的?

时间:原作者:3个回答

0 0

我想我应该用两个 Regex 表达式来做这个。

从字符串开始处获取所有开始信息- 作业 NAME,信息,描述。

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

第一个 Regex 可能类似于:

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

我不知道规则是否允许在作业 NAME,信息或者描述中显示空白- 根据需要调整。 另外,我假设这是使用 ^ 字符的文件的开始。 最后,这个 Regex 已经定义了组,因此在 C# 中获取值应该更容易。

第二个 Regex 可能类似于下面这样:

(?<param>[wd]+)=(?<value>[wd]+)

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

希望这有帮助

编辑:

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

Regex reg = new Regex(@"(?<param>[wd]+)=(?<value>[wd]+)");
原作者:
...