Найти все совпадающие строки с помощью регулярных выражений

#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 . Затем вы можете добавить символ новой строки в качестве замены.

Демонстрация на Regex101

Ответ №3:

Это регулярное выражение может помочь вам разделить вашу строку на нужные части, которые вы хотите.

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

Это создало бы две левые и правые границы для каждого желаемого результата.

Регулярное выражение

Комментарии:

1. Спасибо, но длина каждой команды не является фиксированной, минимальная равна 22, а максимальная равна 240, это не сработает, если я изменил длину команды