我有一个如下的组合命令字符串,每个命令长度不固定,最小为 22,最大为 240:
5B01CA0F00000241FF0201040F325D5B01CA0F00000241FF0201040F335D6B01FF0000000010FF01FF0000000F6D5B01CA0F00000241FF0201040F345D5B01CA0F00000241FF0201040F355D6B01FF0000000010FF01FF0000000F6D
我想提取像 5B....5D 或 6B....6D 这样的命令,所以预期的结果是:
5B01CA0F00000241FF0201040F325D
5B01CA0F00000241FF0201040F335D
6B01FF0000000010FF01FF0000000F6D
5B01CA0F00000241FF0201040F345D
5B01CA0F00000241FF0201040F355D
6B01FF0000000010FF01FF0000000F6D
我使用的正则表达式模式如下
5B[0-9a-fA-F]{22,240}5D
或者
(?<=5B)([0-9a-fA-F]{22,240})(?=5D)
只有一个匹配,任何人都可以帮助我吗?
string regexPattern = "(?<=5B)([0-9a-fA-F]{22,240})(?=5D)";
string command = txtRegexCmd.Text.Trim();
MatchCollection matchedResults = Regex.Matches(command, regexPattern, RegexOptions.IgnoreCase);
string matchedCmd = string.Empty;
foreach (Match matchResult in matchedResults)
{
matchedCmd += matchResult.Value + ",\r\n";
}
MessageBox.Show(matchedCmd);
最佳答案
您可以使用以下方式匹配它们
([65])B.*?\1D
参见 .NET regex demo和正则图:
([65])B.*?\1D
模式捕获到组 1 a 5
或 6
数字,然后匹配 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 .
关于c# - 通过正则表达式查找所有匹配的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55756111/