我有一个如下所示的组合命令字符串,并且每个命令长度都不固定,最小为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
答案 0 :(得分:2)
您可以按照Emma的建议在字符上分割字符串。如果必须使用正则表达式,则可以像这样使用lookbehind。
正则表达式: (?<=5D|6D)
说明::它将在5D
和6D
之后搜索零宽度。然后,您可以添加换行符作为替换。
答案 1 :(得分:1)
您可以使用来匹配它们
([65])B.*?\1D
请参见.NET regex demo和Regulex图:
([65])B.*?\1D
模式将5
或6
数字捕获到组1中,然后匹配B
,然后匹配除换行符以外的任何0+字符,并且尽可能少到第一次出现与第1组中捕获的相同字符的字符,后跟D
。
C#代码:
var results = Regex.Matches(s, @"([65])B.*?\1D")
.Cast<Match>()
.Select(x => x.Value)
.ToList();
如果您想在每个5D
或6D
之后进行拆分,只需使用
var results = Regex.Split(s, @"(?!$)(?<=[56]D)");
在这里,(?!$)(?<=[56]D)
与不是字符串结尾的位置匹配,并且必须紧跟5D
或6D
之后。参见this regex demo。
答案 2 :(得分:0)