通过正则表达式查找所有匹配的字符串

时间:2019-04-19 03:08:44

标签: c# regex

我有一个如下所示的组合命令字符串,并且每个命令长度都不固定,最小为22,最大为240:

  

5B01CA0F00000241FF0201040F325D5B01CA0F00000241FF0201040F335D6B01FF0000000010FF01FF0000000F6D5B01CA0F00000241FF0201040F345D5B01CA0F00000241FF0201040F355D6B01FF0000000010FF01FF0000000F6D

我想提取5B .... 5D或6B .... 6D之类的命令,所以预期结果是:

  

5B01CA0F00000241FF0201040F325D

     

5B01CA0F00000241FF0201040F335D

     

6B01FF0000000010FF01FF0000000F6D

     

5B01CA0F00000241FF0201040F345D

     

5B01CA0F00000241FF0201040F355D

     

6B01FF0000000010FF01FF0000000F6D

我使用了

这样的正则表达式

NSMALLPOSINTS - 1 要么 Oozie workflow : <action name="spark-node" cred="hcred"> <spark xmlns="uri:oozie:spark-action:0.1"> <job-tracker>${value}</job-tracker> <name-node>${value}</name-node> <configuration> <property> <name>mapreduce.job.queue.name</name> <value>${value}</value> </property> </configuration> <master>yarn</master> <mode>cluster</mode> <jar>xyz.py</jar> <spark-opts>${sparkopts}</spark-opts> </spark>

只有一个匹配,有人可以帮我吗?

5B[0-9a-fA-F]{22,240}5D

3 个答案:

答案 0 :(得分:2)

您可以按照Emma的建议在字符上分割字符串。如果必须使用正则表达式,则可以像这样使用lookbehind。

正则表达式: (?<=5D|6D)

说明::它将在5D6D之后搜索零宽度。然后,您可以添加换行符作为替换。

Demo on Regex101

答案 1 :(得分:1)

您可以使用来匹配它们

([65])B.*?\1D

请参见.NET regex demo和Regulex图:

enter image description here

([65])B.*?\1D模式将56数字捕获到组1中,然后匹配B,然后匹配除换行符以外的任何0+字符,并且尽可能少到第一次出现与第1组中捕获的相同字符的字符,后跟D

C#代码:

var results = Regex.Matches(s, @"([65])B.*?\1D")
            .Cast<Match>()
            .Select(x => x.Value)
            .ToList();

enter image description here

如果您想在每个5D6D之后进行拆分,只需使用

var results = Regex.Split(s, @"(?!$)(?<=[56]D)");

在这里,(?!$)(?<=[56]D)与不是字符串结尾的位置匹配,并且必须紧跟5D6D之后。参见this regex demo

enter image description here

答案 2 :(得分:0)

This RegEx可能会帮助您将字符串分成所需的片段。

(?:5|6)B[0-9a-fA-F]{26,28}(?:5|6)D

它将为每个所需的输出创建两个左右边界。

RegEx