Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Захват повторяющейся группы
Я пытаюсь разобрать строку следующим образом, используя регулярное выражение .NET:
H3Y5NC8E-TGA5B6SB-2NVAQ4E0
и вернуть после использования Сплит: H3Y5NC8E TGA5B6SB 2NVAQ4E0
Я проверяю каждый символ по определенному набору символов (обратите внимание, что буквы 'I', 'O', 'U' & 'W' отсутствуют), поэтому использование string.Split не является опцией. Количество символов в каждой группе может варьироваться, и количество групп также может варьироваться. Я использую следующее выражение:
([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8}-?){3}
Это будет соответствовать ровно 3 группам по 8 символов в каждой. Любой более или менее провалит матч. Это работает постольку, поскольку он правильно соответствует входным данным. Однако, когда я использую метод Split для извлечения каждой группы символов, я просто получаю конечную группу. RegexBuddy жалуется, что я повторил саму группу захвата и что я должен поместить группу захвата вокруг повторной группы. Однако ни одна из моих попыток сделать это не привела к желаемому результату. Я уже пробовал такие выражения как это:
(([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})-?){4}
Но это не работает.
Поскольку я генерирую regex в коде, я мог бы просто расширить его на количество групп, но я надеялся на более элегантное решение.
Обратите внимание, что набор символов не включает в себя весь алфавит. Это часть системы активации продукта. Таким образом, все символы, которые могут быть случайно интерпретированы как числа или другие символы, удаляются. например, буквы 'I', 'O', 'U' & 'W' не входят в набор символов.
Дефисы необязательны, так как пользователю не нужно вводить их сверху, но они могут быть там, если пользователь сделал копию & paste.
Кстати, вы можете заменить класс символов [ABCDEFGHJKLMNPQRSTVXYZ0123456789] на более читаемый класс вычитаемых символов.
[[A-Z\d]-[IOUW]]
Если вы просто хотите сопоставить 3 группы таким образом, почему бы вам не использовать этот шаблон 3 раза в вашем regex и просто использовать захваченные 1, 2, 3 подгруппы для формирования новой строки?
([[A-Z\d]-[IOUW]]){8}-([[A-Z\d]-[IOUW]]){8}-([[A-Z\d]-[IOUW]]){8}
В 32 году я бы вернулся (не знаю .NET)
return "$1 $2 $3";
Рассмотрев ваш вопрос и приведенные ответы, я пришел к такому выводу:
RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})", options);
string input = @"H3Y5NC8E-TGA5B6SB-2NVAQ4E0";
MatchCollection matches = regex.Matches(input);
for (int i = 0; i != matches.Count; ++i)
{
string match = matches[i].Value;
}
Поскольку " - " является необязательным, вам не нужно его включать. Я не уверен, для чего вы использовали {4} в конце? Это позволит найти совпадения на основе того, что вы хотите, а затем с помощью MatchCollection вы можете получить доступ к каждому совпадению, чтобы перестроить строку.
Я нашел ответ, который искал. Вот мой рабочий код:
static void Main(string[] args)
{
string pattern = @"^\s*((?<group>[ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})-?){3}\s*$";
string input = "H3Y5NC8E-TGA5B6SB-2NVAQ4E0";
Regex re = new Regex(pattern);
Match m = re.Match(input);
if (m.Success)
foreach (Capture c in m.Groups["group"].Captures)
Console.WriteLine(c.Value);
}
Вы можете использовать этот шаблон:
Regex.Split("H3Y5NC8E-TGA5B6SB-2NVAQ4E0", "([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8}+)-?")
Но вам нужно будет отфильтровать пустые строки из результирующего массива. Цитата из MSDN :
Если несколько совпадений соседствуют друг с другом, то в массив вставляется пустая строка.
Каковы определяющие характеристики допустимого блока? Нам нужно было бы знать это, чтобы действительно быть полезными.
Мое общее предложение, проверить кодировку на первом шаге, а затем разделить и проанализировать в отдельном методе, основанном на том, что вы ожидаете. Если это происходит на веб-сайте / в приложении, то вы можете использовать проверку ASP Regex на переднем конце, а затем разбить ее на заднем конце.
Если вы просто проверяете значение группы, используйте group (i).значение, то вы получите только последнее. Однако если вы хотите перечислить все случаи захвата этой группы, используйте group(2).захватывает (i).значение, как показано ниже.
system.text.RegularExpressions.Regex.Match("H3Y5NC8E-TGA5B6SB-2NVAQ4E0","(([ABCDEFGHJKLMNPQRSTVXYZ0123456789]+)-?)*").Groups(2).Captures(i).Value