powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как получить значение группы в регулярке?
6 сообщений из 6, страница 1 из 1
Как получить значение группы в регулярке?
    #39931773
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В строке "хххххххх2020-01ххххххххх", где "х" означает любой символ (в основном буквы) в произвольном количестве, может быть только один (или ни одного) паттерн "dddd-mm" из двух чисел. Надо его вытащить из строки, распарсив на год и месяц.
Делаю так (с регуляркой пока плохо знаком):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
  Year, Month: word;
  RegEx: TRegEx;
  M: TMatchCollection;
[...]
  M := RegEx.Matches(AString, '(\d{4})-(\d{2})');
  if M.Count > 0 then begin
    Year := M.Item[0].Groups.Item[0].Value.ToInteger;
    Month := M.Item[0].Groups.Item[1].Value.ToInteger;
  end;


Получаю ошибку
Project *.exe raised exception class EConvertError with message ''2020-01' is not a valid integer value for Integer type'.
Хотя регулярка вроде правильно составлена: одно совпадение, две группы - проверка https://regex101.com/r/qSB4ih/2

В чем моя ошибка? Можно ли получить искомое без использования групп?
...
Рейтинг: 0 / 0
Как получить значение группы в регулярке?
    #39931810
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing,

А Groups.Count чему равно?
И если он только один раз встречается, то почему Matches, а не Match?
...
Рейтинг: 0 / 0
Как получить значение группы в регулярке?
    #39931831
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp
LiYing,

А Groups.Count чему равно?
И если он только один раз встречается, то почему Matches, а не Match?


Да, действительно. Заменил.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  
var
  Year, Month: word;
  s: string;
  RegEx: TRegEx;
  M: TMatch;
[...]
  M := RegEx.Match('fdsfsdfd2020-01racts_csvSGR-1_NFU.csv', '(\d{4})-(\d{2})');
  if M.Groups.Count > 0 then begin
    s := M.Groups.Item[0].Value; // = '2020-01' (чтобы посмотреть значение, т.к. Expression illegal in evaluator)
    s := M.Groups.Item[1].Value; // = '2020' 
    Year := s.ToInteger;
    s := M.Groups.Item[2].Value; // = '01' 
    Month := s.ToInteger;
  end;


Так работает, но Groups.Count = 3. Почему?
...
Рейтинг: 0 / 0
Как получить значение группы в регулярке?
    #39931853
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing
Так работает, но Groups.Count = 3. Почему?

Потому что нулевая группа - это весь захваченный текст, даже в вашем примере на regex101 - точно так же.
...
Рейтинг: 0 / 0
Как получить значение группы в регулярке?
    #39931861
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp
LiYing
Так работает, но Groups.Count = 3. Почему?

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

Смутил их лог:
Match 1
Full match 8-15 2020-01
Group 1. 8-12 2020
Group 2. 13-15 01
Тут 2 группы :)

Осталась вторая часть вопроса - можно ли получить искомое без использования групп?
...
Рейтинг: 0 / 0
Как получить значение группы в регулярке?
    #39931862
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing
Осталась вторая часть вопроса - можно ли получить искомое без использования групп?

Можно, написать конечный автомат самому, например.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как получить значение группы в регулярке?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]