#c# #regex
#c# #регулярное выражение
Вопрос:
У меня есть комбинированная командная строка, как показано ниже, и длина каждой команды не является фиксированной, минимум — 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 ",rn";
}
MessageBox.Show(matchedCmd);
Комментарии:
1. Да, если с помощью регулярных выражений невозможно, я буду использовать разделение строк для реализации.
2.
Regex.Split(s, @"(?<=[56]D)")
.
Ответ №1:
Вы можете сопоставить их с помощью
([65])B.*?1D
Смотрите демонстрацию регулярных выражений .NET и график регулярных выражений:
([65])B.*?1D
Шаблон записывается в группу 1 a 5
или 6
digit, затем сопоставляется B
, затем любые символы 0 , отличные от новой строки, как можно меньше, вплоть до первого появления того же символа, который был записан в группе 1, за которым следует with 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
. Посмотрите <a rel=»noreferrer noopener nofollow» href=»https:///regexstorm.net/tester?p=(?!$)(?эту демонстрацию регулярных выражений.
Ответ №2:
Вы можете разделить строку на символы, как предложила Эмма. Если вам необходимо использовать регулярное выражение, вы можете использовать lookbehind следующим образом.
Регулярное выражение: (?<=5D|6D)
Объяснение: он будет искать нулевую ширину после 5D
и 6D
. Затем вы можете добавить символ новой строки в качестве замены.
Ответ №3:
Это регулярное выражение может помочь вам разделить вашу строку на нужные части, которые вы хотите.
(?:5|6)B[0-9a-fA-F]{26,28}(?:5|6)D
Это создало бы две левые и правые границы для каждого желаемого результата.
Комментарии:
1. Спасибо, но длина каждой команды не является фиксированной, минимальная равна 22, а максимальная равна 240, это не сработает, если я изменил длину команды