Вверх ↑
Этот топик читают: Гость
Ответов: 1536
Рейтинг: 176
#1: 2012-12-22 15:10:27 ЛС | профиль | цитата
Хотелось бы увидеть пример по использованию нижней точки Matches (Содержит массив совпадений всех подгрупп регулярного выражения в следующем формате MT-потока: [Match][Position][Length]) элемента RE_Search. Почему-то у меня есть доступ чтения только к первому найденному вхождению по индексу, и всё. А мне-то нужно ко всем. И вот не получается. Может авторы и разработчики Abulafia и Assasin что-то пояснят.
Add(MainForm,2953706,182,224)
{
Width=1178
Height=639
}
Add(Button,7949013,182,266)
{
Left=295
Top=5
Caption="Open"
link(onClick,1960316:doExec,[])
}
Add(StrList,3583572,259,210)
{
FileName="test.txt"
Strings=#6:Level_|11:Бла,бла,бла|11:Блу,блу,блу|4:end_|6:Level_|13:Хоп, хоп, хоп|13:Хуп, хуп, хуп|13:Хап, хап, хап|4:end_|6:Level_|13:Поп, поп, поп|13:Пуп, пуп, пуп|13:Пап, пап, пап|4:end_|6:Level_|13:Лоп, лоп, лоп|13:Луп, луп, луп|13:Лап, лап, лап|4:end_|
}
Add(RE_Search,1960316,259,266)
{
Expression="Level_.*?end_"
Point(Matches)
link(onMatch,1960316:doExecNext,[(302,272)(302,304)(247,304)(247,279)])
link(SourceStr,3583572:Text,[])
}
Add(UpDown,956442,189,322)
{
Left=85
Top=30
Width=50
Height=85
Max=1000
link(onPosition,9925749:doText,[])
}
Add(Memo,3329315,357,322)
{
Left=200
Top=45
Width=805
Height=535
ScrollBars=3
}
Add(MT_MTArrayRW,187780,280,322)
{
link(onRead,5374687:doEvent,[])
link(Array,1960316:Matches,[])
}
Add(Edit,9925749,231,322)
{
Left=145
Top=60
Text="0"
DataType=1
link(onChange,187780:doRead,[])
}
Add(Debug,5374687,329,322)
{
link(onEvent,3329315:doAdd,[])
}
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Гость
Ответов: 17029
Рейтинг: 0
#2: 2012-12-22 15:59:13 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2025-01-09 08:00:41
карма: 0

0
Разработчик
Ответов: 4698
Рейтинг: 426
#3: 2012-12-22 16:19:30 ЛС | профиль | цитата
ser_davkin, для начала следует понять, что регулярное выражение может состоять из подгрупп, которые можно создать с помощью скобок, например:
name=(w+), age=(d+)
Данная регулярка найдет вхождения строк вида "name=ser_davkin, age=30", при этом у нас есть две подгруппы, будем называть их соответственно name и age, так вот чтобы "выдернуть" из найденной строки имя и возраст мы можем использовать данные подгруппы. Чтобы получить содержимое подгруппы мы как раз и используем точку Matches, по индексу 0 у нас будет лежать строка "ser_davkin", а по индексу 1 - "30", длинна массива подгрупп соответственно будет равна 2.
  Важно понять, что в Matches не накапливаются результаты поиска всех подстрок в тексте (попытки использования чего мы видим в примерах выше), в этом массиве хранятся только подгруппы для текущей найденной подстроки.
  Если нам нужны вхождения всех подстрок, можно воспользоваться такой схемой:
Add(MainForm,7743276,504,161)
{
Width=1178
Height=639
}
Add(Button,7949013,504,203)
{
Left=295
Top=5
Caption="Open"
link(onClick,10391187:doEvent1,[])
}
Add(StrList,3583572,637,147)
{
FileName="test.txt"
Strings=#6:Level_|11:Бла,бла,бла|11:Блу,блу,блу|4:end_|6:Level_|13:Хоп, хоп, хоп|13:Хуп, хуп, хуп|13:Хап, хап, хап|4:end_|6:Level_|13:Поп, поп, поп|13:Пуп, пуп, пуп|13:Пап, пап, пап|4:end_|6:Level_|13:Лоп, лоп, лоп|13:Луп, луп, луп|13:Лап, лап, лап|4:end_|
}
Add(RE_Search,1960316,637,210)
{
Expression="Level_.*?end_"
Point(Matches)
link(onMatch,3329315:doAdd,[])
link(onNotFound,9078604:doStop,[(681,223)(681,257)(575,257)(575,230)])
link(SourceStr,3583572:Text,[])
}
Add(Memo,3329315,714,210)
{
Left=200
Top=45
Width=805
Height=535
ScrollBars=3
}
Add(Hub,10391187,553,203)
{
OutCount=3
link(onEvent1,3329315:doClear,[(686,209)(686,223)])
link(onEvent2,1960316:doExec,[])
link(onEvent3,9078604:doRepeat,[])
}
Add(Repeat,9078604,588,217)
{
Op1=Integer(0)
Op2=Integer(0)
link(onRepeat,1960316:doExecNext,[])
}

37.45.76.40 писал(а):
а он не пустой, а бесконечный (повесит программу если убрать ограничитель)

Это небольшой бажок, сейчас поправлю.
37.45.76.40 писал(а):
И почему пустой массив выдает количество = -1?

Не понял, где он это выдает?
карма: 10
0
Гость
Ответов: 17029
Рейтинг: 0
#4: 2012-12-22 16:24:47 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2025-01-09 08:00:42
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#5: 2012-12-22 16:32:45 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2025-01-09 08:00:42
карма: 0

0
Разработчик
Ответов: 4698
Рейтинг: 426
#6: 2012-12-22 16:41:44 ЛС | профиль | цитата
37.45.76.40, -1 возвращает движок регулярок, а в реализацию движка мы не лезем. -1 означает, что поиск вообще не проводился. Я, конечно, могу добавить проверку на -1, чтобы заменялось на 0, но стоит ли оно процессорного времени
карма: 10
0
Гость
Ответов: 17029
Рейтинг: 0
#7: 2012-12-22 16:49:30 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2025-01-09 08:00:42
карма: 0

0
Ответов: 1536
Рейтинг: 176
#8: 2012-12-22 16:54:13 ЛС | профиль | цитата
Assasin, ага, понял.
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Разработчик
Ответов: 4698
Рейтинг: 426
#9: 2012-12-22 16:58:08 ЛС | профиль | цитата
Обновление с фиксами залито на svn, проверка на -1 добавлена.
------------ Дoбавленo в 16.58:
[offtop]37.45.76.40, а кто вы? + бы вам поставить[/offtop]
карма: 10
1
Голосовали:ser_davkin
Гость
Ответов: 17029
Рейтинг: 0
#10: 2012-12-22 17:03:27 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2025-01-09 08:00:42
карма: 0

0
10
Сообщение
...
Прикрепленные файлы
(файлы не залиты)