Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не верно работают регулярные выражения

20K
29 июня 2012 года
HowlingWind
32 / / 13.01.2008
Добрый день!

Есть строка типа "sdfs5342Цех=45;sdfsr4325234sdf"
Надо получить номер цеха.
Для этого использую регулярное выражение "Цех=(\d++);"
Программа возвращает "Цех=45;"

Помогите найти ошибку! Заранее благодарю!

Код:
procedure TForm8.Button1Click(Sender: TObject);
var
  M: TMatchCollection;
  i: Integer;
  re: TRegEx;
begin
  //Получаю список номеров цехов
  Memo1.Clear;
  if TRegEx.IsMatch(Edit1.Text, 'Цех=(\d++);', [roExplicitCapture]) then begin
    M := TRegEx.Matches(Edit1.Text, 'Цех=(\d++);', [roExplicitCapture]);
    for i := 0 to M.Count - 1 do begin
      Memo1.Lines.Add(M[i].Value);
    end;
  end;
end;
  • В чем ошибка то? от arrjj, 29 июня 2012 года
20K
02 июля 2012 года
HowlingWind
32 / / 13.01.2008
Возвращает "Цех=45;", а я хочу чтобы возвращал число "45"
1
02 июля 2012 года
kot_
7.3K / / 20.01.2000
а если так 'Цех=(\d+);' ?
20K
02 июля 2012 года
HowlingWind
32 / / 13.01.2008
Цитата: kot_
а если так 'Цех=(\d+);' ?


Тоже самое: Цех=45;

Пишу на Dephi XE2, если это важно.

37K
02 июля 2012 года
freets
97 / / 15.10.2010
а если так:

 
Код:
(?:Цех=)(\d+)
?
1
02 июля 2012 года
kot_
7.3K / / 20.01.2000
Цитата: HowlingWind
Цитата: kot_
а если так 'Цех=(\d+);' ?


Тоже самое: Цех=45;

Пишу на Dephi XE2, если это важно.


не знаю на делфи проверить не могу. а что вернет M[1].Value для выражения (Цех=)(\d+)(;)?

20K
02 июля 2012 года
HowlingWind
32 / / 13.01.2008
все равно Цех=15
20K
02 июля 2012 года
HowlingWind
32 / / 13.01.2008
Цитата:
не знаю на делфи проверить не могу. а что вернет M[1].Value для выражения (Цех=)(\d+)(;)?



Ничего не возвращает. Совсем ничего.

1
02 июля 2012 года
kot_
7.3K / / 20.01.2000
ну тогда так:

 
Код:
M := TRegEx.Matches(Edit1.Text, '(?:Цех=)(\d++)(?:;)', [roIgnoreCase]);
[roIgnoreCase] - а не [roExplicitCapture]. пробуй
ну и я думаю понятно, что при таком реге надо проверять не M[1].Value а M[0].Value
20K
03 июля 2012 года
HowlingWind
32 / / 13.01.2008
Цитата: kot_

 
Код:
M := TRegEx.Matches(Edit1.Text, '(?:Цех=)(\d++)(?:;)', [roIgnoreCase]);
[roIgnoreCase] - а не [roExplicitCapture]. пробуй
ну и я думаю понятно, что при таком реге надо проверять не M[1].Value а M[0].Value



Все равно возвращает "Цех=45;"

7.6K
03 июля 2012 года
intro
22 / / 12.04.2005
Вот такое регулярное выражение возвращает номер цеха из твоей строки вторым элементом массива
20K
03 июля 2012 года
HowlingWind
32 / / 13.01.2008
Цитата: intro
Вот такое регулярное выражение возвращает номер цеха из твоей строки вторым элементом массива



Дак вот! Должно работать. Но у меня в MatchCollection только одна запись TMatch со значением "Цех=45"!

1
03 июля 2012 года
kot_
7.3K / / 20.01.2000
Цитата: HowlingWind
Цитата: intro
Вот такое регулярное выражение возвращает номер цеха из твоей строки вторым элементом массива



Дак вот! Должно работать. Но у меня в MatchCollection только одна запись TMatch со значением "Цех=45"!


на самом деле практически все предложенные варианты - 100% рабочие. Ищи ошибки в своем коде. Либо есть баг в делфийской реализации.

1
03 июля 2012 года
kot_
7.3K / / 20.01.2000
Или ты проверяешь только первый элемент массива. Используй отладчик и посмотри что у тебя творится при поиске.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог