purebasic.info
http://purebasic.info/phpBB3ex/

Обучение регулярным выражениям в PB
http://purebasic.info/phpBB3ex/viewtopic.php?f=6&t=954
Страница 6 из 6

Автор:  Smitis [ Пт июн 20, 2014 7:08 am ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

В 5.11 если убрать относящиеся к модулям, компилится.
В 5.21 - нет. Возможно, это из-за неполноценной версии, которая ходила на просторах инета.

Но в любом случае алгоритм обламывается на русских буквах, так как смещение вычисляется не правильно: pb_pcre_exec работает с utf8, смещения возвращает в байтах, а PB в юникоде и смещение <> позиция символа. Тут надо бы перевести строку из юникода в utf8 и работать с ней как с бинарной строкой (на худой конец как с ansi). Но как?

Автор:  Smitis [ Ср июн 25, 2014 8:51 pm ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

Получился такой вот вариант для юникода.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 
EnableExplicit
 
ImportC ""
        ;pb_pcre_exec(*pcre, *extra, subject.p-utf8, length, startoffset, options, *ovector, ovecsize)
        pb_pcre_exec(*pcre, *extra, *subject, length, startoffset, options, *ovector, ovecsize)
EndImport
 
Procedure.i RegexCreate( Pattern.s, IgnoreCase.l=#True )
        If IgnoreCase : IgnoreCase = #PB_RegularExpression_NoCase : EndIf
        ProcedureReturn CreateRegularExpression(#PB_Any,Pattern,IgnoreCase)
EndProcedure
 
Procedure.s RegexReplace( Regex.i, Subject.s, Replacement.s )
        Protected Dim ovec.i(30) ;, MaximumReference.i=9
        Protected GroupCount.i, GroupNumber.i, GroupBuffer.i, GroupBegin.i, GroupEnd.i, GroupString.s
        Protected MatchBegin.i, MatchEnd.i, MatchBuffer.i, MatchString.s
        Protected Result.s, Replacing.s
        Protected SubjectLength.i=StringByteLength(Subject,#PB_UTF8), offset.i
        Protected SubjectBuffer=AllocateMemory(SubjectLength+1,#PB_Memory_NoClear)
        Protected q.s=Chr(34)
        PokeS(SubjectBuffer,Subject,-1,#PB_UTF8)
 
        While offset < SubjectLength
                GroupCount = pb_pcre_exec(PeekL(Regex),0,SubjectBuffer,SubjectLength,offset,0,ovec(),ArraySize(ovec()))
                If GroupCount > 0 ; если не нашли = -1; если нашли 1 - совпадение; >1 - группы
                        Replacing = Replacement
                        MatchBegin = ovec(0)
                        MatchEnd = ovec(1)
                        MatchString = PeekS(SubjectBuffer+MatchBegin,MatchEnd-MatchBegin,#PB_UTF8)
                        If MatchBegin > offset
                                ; часть строки между началом и первым совпадением или между двумя совпадениями
                                Result + PeekS(SubjectBuffer+offset,MatchBegin-offset,#PB_UTF8)
                        EndIf
                        Debug "Match: "+Str(MatchBegin)+","+Str(MatchEnd)+" "+q+MatchString+q+" Left: "+q+PeekS(SubjectBuffer+offset,MatchBegin-offset,#PB_UTF8)+q+" Groups: "+Str(GroupCount)
                        Replacing = ReplaceString(Replacing,"\0",MatchString)
                        For GroupNumber = 1 To GroupCount-1 ; извлекаем группы и заменяем backref
                                GroupBegin = ovec(GroupNumber*2)
                                GroupEnd = ovec(GroupNumber*2+1)
                                ;If GroupEnd > GroupBegin ; ???
                                        GroupString = PeekS(SubjectBuffer+GroupBegin,GroupEnd-GroupBegin,#PB_UTF8)
                                        Replacing = ReplaceString(Replacing,"\"+Str(GroupNumber),GroupString)
                                ;EndIf
                                Debug "Group: "+Str(GroupBegin)+","+Str(GroupEnd)+" "+q+GroupString+q
                        Next
                        Result + Replacing
                        offset = MatchEnd
                Else ; больше ничего не найдено или вообще ничего не найдено, остаток строки в Result
                        Result + PeekS(SubjectBuffer+offset,SubjectLength-offset,#PB_UTF8)
                        Break
                EndIf
        Wend
        Debug "Subject: "+q+Subject+q
        Debug "Result:  "+q+Result+q
        FreeMemory(SubjectBuffer)
        ProcedureReturn Result
EndProcedure
 
Define.i rex = RegexCreate( "(..)(\d)(\d)(..)" )
RegexReplace( rex, "жумтых12поцы34ыахбул56пролд78йцукг", "<\4-\3\2-\1>" )
;RegexReplace( rex, "qwerty12uiop34asdfgh56jklzx78cvbnm", "<\4-\3\2-\1>" )
 


Автор:  Smitis [ Пт сен 04, 2015 2:39 am ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

Коллеги, вот собрал варианты функций замены с использованием регулярных выражений, аж 4 варианта получилось.
RegexReplace
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
 
; Для юникода! Сохранять в UTF8!
 
EnableExplicit
 
ImportC ""
        ;pb_pcre_exec(*pcre, *extra, subject.p-utf8, length, startoffset, options, *ovector, ovecsize)
        pb_pcre_exec(*pcre, *extra, *subject, length, startoffset, options, *ovector, ovecsize)
EndImport
 
;==========================================================================================================================
Procedure.s RegexReplace1( Regex, Subject.s, Replacement.s )
        Protected Dim ovec(30) ; для MaximumReference = 9
        Protected GroupBegin, GroupEnd, GroupCount, GroupNumber, Offset
        Protected Result.s, Replacing.s
        Protected SubjectLength = StringByteLength(Subject,#PB_UTF8)
        Protected SubjectBuffer = AllocateMemory(SubjectLength+1,#PB_Memory_NoClear)
        PokeS(SubjectBuffer,Subject,-1,#PB_UTF8)
        While Offset < SubjectLength ; будем вызывать pb_pcre_exec, пока не закончится строка
                ; -1 - не нашли; 1 - совпадение; >1 - совпадение и группы
                GroupCount = pb_pcre_exec(PeekL(Regex),0,SubjectBuffer,SubjectLength,Offset,0,ovec(),ArraySize(ovec())) - 1
                If GroupCount >= 0
                        Replacing = Replacement
                        For GroupNumber=0 To 9 ; извлекаем группы и заменяем обратные ссылки
                                GroupBegin = ovec(GroupNumber*2)
                                GroupEnd = ovec(GroupNumber*2+1)
                                ; Если группы нет, то в ovec будут нули и PeekS вернёт пустую строку
                                Replacing = ReplaceString(Replacing,"\"+Str(GroupNumber),PeekS(SubjectBuffer+GroupBegin,GroupEnd-GroupBegin,#PB_UTF8))
                        Next
                        ; ovec(0) - начало совпадения, ovec(1) - конец совпадения
                        ; Result + часть строки между началом и первым совпадением или между двумя совпадениями + результат подстановки групп
                        Result + PeekS(SubjectBuffer+Offset,ovec(0)-Offset,#PB_UTF8) + Replacing
                        Offset = ovec(1)
                Else ; больше ничего не найдено или вообще ничего не найдено
                        ; Result + остаток строки
                        Result + PeekS(SubjectBuffer+Offset,SubjectLength-Offset,#PB_UTF8)
                        Break
                EndIf
        Wend
        FreeMemory(SubjectBuffer)
        ProcedureReturn Result
EndProcedure
 
;==========================================================================================================================
Procedure.s RegexReplace2( Regex, Subject.s, Replacement.s )
        Protected GroupNumber, GroupCount, MatchPos, Offset=1
        Protected Replacing.s, Result.s
        If ExamineRegularExpression(Regex,Subject)
                While NextRegularExpressionMatch(Regex)
                        MatchPos = RegularExpressionMatchPosition(Regex)
                        Replacing = ReplaceString(Replacement,"\0",RegularExpressionMatchString(Regex)) ; обратная ссылка \0
                        GroupCount = CountRegularExpressionGroups(Regex)
                        If GroupCount>9 : GroupCount=9 : EndIf ; только обратные ссылки \1 .. \9
                        For GroupNumber=1 To GroupCount
                                Replacing = ReplaceString(Replacing,"\"+Str(GroupNumber),RegularExpressionGroup(Regex,GroupNumber))
                        Next
                        For GroupNumber=GroupCount+1 To 9 ; отсутствующие группы на пустые строки
                                Replacing = ReplaceString(Replacing,"\"+Str(GroupNumber),"")
                        Next
                        ; Result + часть строки между началом и первым совпадением или между двумя совпадениями + результат подстановки групп
                        Result + Mid(Subject,Offset,MatchPos-Offset) + Replacing
                        Offset = MatchPos+RegularExpressionMatchLength(Regex)
                Wend
                ProcedureReturn Result + Mid(Subject,Offset) ; Result + остаток строки
        EndIf
        ProcedureReturn Subject ; без изменений
EndProcedure
 
;==========================================================================================================================
Procedure.s RegexReplace3( Regex, Subject.s, Replacement.s )
        Protected Dim ovec(30) ; для MaximumReference = 9
        Protected Dim Groups.s(9)
        Protected GroupBegin, GroupEnd, GroupCount, GroupNumber, Offset
        Protected RPos, ROffset, RLen=Len(Replacement)
        Protected Result.s, Replacing.s
        Protected SubjectLength = StringByteLength(Subject,#PB_UTF8)
        Protected SubjectBuffer = AllocateMemory(SubjectLength+1,#PB_Memory_NoClear)
        PokeS(SubjectBuffer,Subject,-1,#PB_UTF8)
        While Offset < SubjectLength ; будем вызывать pb_pcre_exec, пока не закончится строка
                ; -1 - не нашли; 1 - совпадение; >1 - совпадение и группы
                GroupCount = pb_pcre_exec(PeekL(Regex),0,SubjectBuffer,SubjectLength,Offset,0,ovec(),ArraySize(ovec())) - 1
                If GroupCount >= 0
                        For GroupNumber=0 To 9
                                ; Извлекаем строку совпадения (\0) и группы (\1..\9).
                                ; Если группы нет, то в ovec будут нули и PeekS вернёт пустую строку
                                GroupBegin = ovec(GroupNumber*2)
                                GroupEnd = ovec(GroupNumber*2+1)
                                Groups(GroupNumber) = PeekS(SubjectBuffer+GroupBegin,GroupEnd-GroupBegin,#PB_UTF8)
                        Next
                        Replacing = ""
                        RPos = 1
                        ROffset = 1
                        While RPos < RLen ; последний символ не обрабатываем
                                Select Mid(Replacement,RPos,2)
                                        Case "\\"
                                                RPos + 2
                                        Case "\0","\1","\2","\3","\4","\5","\6","\7","\8","\9"
                                                GroupNumber = Val(Mid(Replacement,RPos+1,1))
                                                Replacing + Mid(Replacement,ROffset,RPos-ROffset) + Groups(GroupNumber)
                                                RPos + 2
                                                ROffset = RPos
                                        Default
                                                RPos + 1
                                EndSelect
                        Wend
                        ; ovec(0) - начало совпадения, ovec(1) - конец совпадения
                        ; Result + часть строки между началом и первым совпадением или между двумя совпадениями
                        ;        + результат подстановки групп
                        ;        + остаток строки замены
                        Result + PeekS(SubjectBuffer+Offset,ovec(0)-Offset,#PB_UTF8) + Replacing + Mid(Replacement,ROffset)
                        Offset = ovec(1)
                Else ; больше ничего не найдено или вообще ничего не найдено
                        ; Result + остаток строки
                        Result + PeekS(SubjectBuffer+Offset,SubjectLength-Offset,#PB_UTF8)
                        Break
                EndIf
        Wend
        FreeMemory(SubjectBuffer)
        ProcedureReturn Result
EndProcedure
 
;==========================================================================================================================
Procedure.s RegexReplace4( Regex, Subject.s, Replacement.s )
        Protected MatchPos, GroupNumber, GroupCount, Offset=1
        Protected RPos, ROffset, RLen=Len(Replacement)
        Protected Replacing.s, Result.s, Spec.s
        If ExamineRegularExpression(Regex,Subject)
                While NextRegularExpressionMatch(Regex)
                        MatchPos = RegularExpressionMatchPosition(Regex)
                        GroupCount = CountRegularExpressionGroups(Regex)
                        Replacing = ""
                        RPos = 1
                        ROffset = 1
                        While RPos < RLen ; последний символ не обрабатываем
                                Spec = Mid(Replacement,RPos,2)
                                Select Spec
                                        Case "\\"
                                                RPos + 2
                                        Case "\0"
                                                Replacing + Mid(Replacement,ROffset,RPos-ROffset) + RegularExpressionMatchString(Regex)
                                                RPos + 2
                                                ROffset = RPos
                                        Case "\1","\2","\3","\4","\5","\6","\7","\8","\9"
                                                GroupNumber = Val(Mid(Spec,2))
                                                Replacing + Mid(Replacement,ROffset,RPos-ROffset)
                                                If GroupNumber <= GroupCount ; существующая группа, иначе - пусто
                                                        Replacing + RegularExpressionGroup(Regex,GroupNumber)
                                                EndIf
                                                RPos + 2
                                                ROffset = RPos
                                        Default
                                                RPos + 1
                                EndSelect
                        Wend
                        ; Result + часть строки между началом и первым совпадением или между двумя совпадениями
                        ;        + результат подстановки групп
                        ;        + остаток строки замены
                        Result + Mid(Subject,Offset,MatchPos-Offset) + Replacing + Mid(Replacement,ROffset)
                        Offset = MatchPos+RegularExpressionMatchLength(Regex)
                Wend
                ProcedureReturn Result + Mid(Subject,Offset) ; Result + остаток строки
        EndIf
        ProcedureReturn Subject ; без изменений
EndProcedure
 
;==========================================================================================================================
 
Define rex, r.s, s.s
 
r = "([abxy]+)..([abxy]+)"
s = "!----aaa\1bbb----!----xyxyx\2yxyxy----!"
rex = CreateRegularExpression(#PB_Any, r, #PB_RegularExpression_NoCase)
Debug s
Debug RegexReplace1( rex, s, "<\2===\0===\1><\4>" )
Debug RegexReplace2( rex, s, "<\2===\0===\1><\4>" )
Debug RegexReplace3( rex, s, "<\2===\0===\1><\4>" )
Debug RegexReplace4( rex, s, "<\2===\0===\1><\4>" )
 


Что за функции

RegexReplace1 - вариант на базе встроенной pb_pcre_exec. Идея взята с офф. форума, но там кривой вариант (криво работает с национальными символами). Работать должна в старых версиях Пурика, в том числе 5.11. Недостаток - подстановка обратных ссылок через ReplaceString что может вызвать "рекурсивную" вставку левых обратных ссылок и неправильному результату.

RegexReplace2 - с новыми функциями и тем же недостатком использования ReplaceString. Зато коротко.
Интересно, что когда в рабочей программе попробовал заменить первый вариант на второй, размер кода увеличился (правда, немного). К слову об оптимизации.

RegexReplace3 - на базе pb_pcre_exec. С посимвольным сканированием для замены обратных ссылок. Типа, долго. Зато, помимо устранения проблемы, можно экранировать символ \ и можно расширить на другие специальные символы. Должна работать в старых версиях Пурика.

RegexReplace4 - типа RegexReplace3, но на базе новых функций.

С именованными группами я не заморачивался. Количество обратных ссылок ограничил девятью.

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

Автор:  qpAHToMAS [ Ср окт 26, 2016 4:58 pm ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

Очень удобный сервис:
http://regexr.com/

И вопрос: как "вырезать" с помощью регулярок?

Например, имеем исходные данные:
Код:
1
2
3
4
5
6
Random Text
Car Speed: 132 km/h
Randooooooooooom TXT
Car Speed: 120 km/h
BLA BLA BLA BLA BLA
Car Speed: 145 km/h


Необходимо достать скорости, это подходит:
Код:
1
Car Speed: [0-9]+ km\/h


Но мы получим результат ввиде строк со скоростями и текстом, а как получить результат сразу ввиде чисел? Т.е. такой:
Код:
1
2
3
132
120
145


Автор:  SereZa [ Ср окт 26, 2016 5:49 pm ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

эээ... стрингфилд? between?

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
text$ = "Car Speed: 132 km/h"
 
tmp$ = Between(text$, ": ", " km")
speed = val(tmp$)
Debug speed
 
text$ = Trim(text$)
cycle = CountString(text$, " ")
 
For i = 1 To cycle
  If StringField(text$, i, " ") = "Speed:"
    speed$ = StringField(text$, i+1, " ")
  EndIf
Next
 
Debug speed$ ; повторить с Val
 



а... так это для чего-то другого, не для PB?

Автор:  qpAHToMAS [ Ср окт 26, 2016 6:10 pm ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

В том то и дело, что я хочу это сделать одним RegExp'ом, а не потом еще поправлять, вырезать строки после регулярок.

Автор:  registrymechanic [ Чт окт 27, 2016 11:58 am ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

qpAHToMAS писал(а):
В том то и дело, что я хочу это сделать одним RegExp'ом, а не потом еще поправлять, вырезать строки после регулярок.

если, конечно, я правильно понял задачу....
...не знаю сработает или нет, попробуй в своем коде это, а вдруХ :) :
(?<=Car Speed:\s)[0-9]+(?=\skm\/h)
UPD:
Код:
1
2
3
4
5
6
7
8
9
Random Text
Car Speed: 132 km/h
Randooooooooooom TXT
Car Speed: 120 km/h
BLA BLA BLA BLA BLA
Car Speed: 145 km/h
Cr Speed: 111 km/h
Car Speed: 222 k/h
333

code
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Procedure RegularExpressionString(string.s, RegExp.s, Array ArrayResult.s(1))
Protected NbFound.i=0, RegExpID.i
RegExpID=CreateRegularExpression(#PB_Any, RegExp)
 If RegExpID
    NbFound = ExtractRegularExpression(RegExpID, string, ArrayResult())
    FreeRegularExpression(RegExpID)
  Else
    MessageRequester("Information", RegularExpressionError())
  EndIf
;   CloseHandle_(RegExpID)
ProcedureReturn NbFound
EndProcedure
 
Dim ArrayResult.s(0)
 
string.s ="Random Text" + #CRLF$ + "Car Speed: 132 km/h" + #CRLF$ + "Randooooooooooom TXT" + #CRLF$ + "Car Speed: 120 km/h" + #CRLF$ + "BLA BLA BLA BLA BLA" + #CRLF$ + "Car Speed: 145 km/h" + #CRLF$ + "Cr Speed: 111 km/h" + #CRLF$ + "Car Speed: 222 k/h" + #CRLF$ + "333"
RegExp.s ="(?<=Car Speed:\s)[0-9]+(?=\skm\/h)"
 
If RegularExpressionString(string.s, RegExp.s, ArrayResult.s()) > 0
  For x = 0 To ArraySize(ArrayResult())
    Debug ArrayResult(x)
  Next
EndIf


ps: https://regex101.com/

Автор:  qpAHToMAS [ Чт окт 27, 2016 12:59 pm ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

Да, то что надо, спасибо!

Автор:  Smitis [ Пт май 26, 2017 7:40 pm ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

Ахтунг!
Функция pb_pcre_exec после 5.31 стала работать как-то по другому. Мои примеры viewtopic.php?f=1&t=3960&start=45 на основе этой функции работают неправильно с национальными (в том числе русскими) кодировками. Что-то разлабы там намудрили, хотя версия PCRE та же (8.30 2012-02-04). Подозреваю, это как-то связано с полным отказом от поддержки ANSI после 5.31. Надо разбираться. Встроенные функции (и мои примеры на основе их) работают правильно.

Автор:  Пётр [ Пт май 26, 2017 8:04 pm ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

Smitis писал(а):
Функция pb_pcre_exec после 5.31 стала работать как-то по другому.
В чем это выражается? Запустил пример в 5.31 и 5.60. Разницы не заметил.

Автор:  Smitis [ Сб май 27, 2017 9:23 pm ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

Пётр писал(а):
В чем это выражается? Запустил пример в 5.31 и 5.60. Разницы не заметил.

В своём примере меняю "а" строчную на "А" заглавную.
Код:
1
2
3
4
5
6
7
8
r = "а"
s = "Мистер глянул на меня одним глазом, а затем, принюхавшись, укоризненно помахал обрубком хвоста."
rex = CreateRegularExpression(#PB_Any, r, #PB_RegularExpression_NoCase)
Debug s
Debug RegexReplace1( rex, s, "А" )
Debug RegexReplace2( rex, s, "А" )
Debug RegexReplace3( rex, s, "А" )
Debug RegexReplace4( rex, s, "А" )


Результат:
Код:
1
2
3
4
5
Мистер глянул на меня одним глазом, а затем, принюхавшись, укоризненно помахал обрубком хвоста.
Мистер глянул на меня одним А меня одним глазом, а затАзом, а зА заАтем, принюхавшись, уАвшись, укоризненно помахал обрубком хвостАхаАл обрубком хвоста.А.
Мистер глянул нА меня одним глАзом, А зАтем, принюхАвшись, укоризненно помАхАл обрубком хвостА.
Мистер глянул на меня одним А меня одним глазом, а затАзом, а зА заАтем, принюхавшись, уАвшись, укоризненно помахал обрубком хвостАхаАл обрубком хвоста.А.
Мистер глянул нА меня одним глАзом, А зАтем, принюхАвшись, укоризненно помАхАл обрубком хвостА.



PB 5.51
Поменяли UTF-8 на CP-1200? Позже проверю, сейчас нет времени.

Автор:  qpAHToMAS [ Вс мар 04, 2018 2:08 pm ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

Кавычки в PB просто убивают.
У меня готова регулярка:
Код:
1
href=".\/viewtopic.php\?f=[0-9]+&amp;t=([0-9]+)" class="topictitle">(.*)<\/a>[^]+?<;p class="topicdetails">([0-9]+)<\/p>


https://regexr.com/3llfr

Я её копирую и переношу в PB, по пути заменив " кавычки на " + Chr(34) + ":
Код:
1
href=" + Chr(34) + ".\/viewtopic.php\?f=[0-9]+&amp;t=([0-9]+)" + Chr(34) + " class=" + Chr(34) + "topictitle" + Chr(34) + ">(.*)<\/a>[^]+?<p class=" + Chr(34) + "topicdetails" + Chr(34) + ">([0-9]+)<\/p>


Код:
1
2
CreateRegularExpression(0, "href=" + Chr(34) + ".\/viewtopic.php\?f=[0-9]+&amp;t=([0-9]+)" + Chr(34) + " class=" + Chr(34) + "topictitle" + Chr(34) + ">(.*)<\/a>[^]+?<p class=" + Chr(34) + "topicdetails" + Chr(34) + ">([0-9]+)<\/p>")
Debug RegularExpressionError()


И получаю "unmatched parentheses" ошибку.
Что не так?

Автор:  mestnyi [ Вс мар 04, 2018 5:30 pm ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

Код:
1
2
3
4
5
r.s = ~"href=\".\\/viewtopic.php\\?f=[0-9]+&amp;t=([0-9]+)\" Class=\"topictitle\">(.*)<\\/a>[^^]+?<p Class=\"topicdetails\">([0-9]+)<\\/p>"
 
CreateRegularExpression(0, r)
Debug RegularExpressionError()
 


Вот так не ругается
проблема вот здесь
Код:
1
[^]+?


Работает вот так получается в PCRE надо указать какой символ исключить))
Код:
1
[^^]+?


А так лучше проверять вот здесь))
https://regex101.com/

Автор:  jobless [ Вс мар 04, 2018 5:41 pm ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

по ссылке https://regexr.com/3llfr справа в верху выбор RegEx Engines из двух вариантов
javascript [он выбран и выражение для него корректно]
pcre [при выборе также ругается]

Автор:  qpAHToMAS [ Вт мар 06, 2018 4:38 am ]
Заголовок сообщения:  Re: Обучение регулярным выражениям в PB

jobless писал(а):
по ссылке https://regexr.com/3llfr справа в верху выбор RegEx Engines из двух вариантов
javascript [он выбран и выражение для него корректно]
pcre [при выборе также ругается]

Спасибо, не обращал внимания, PCRE на [^] вроде ругалось.

Страница 6 из 6 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/