Что нового

Кто знает PureBasic - помогите перевести несколько фрагментов AutoIt -> PB

Suppir

Продвинутый
Сообщения
967
Репутация
62
Привет!

Подскажите, как правильно перевести следующий код с AutoIt на PureBasic. Используются одни и те же регулярные выражения (PCRE), но в обоих языках есть свои "особенности". Особенности PureBasic мне пока неизвестны, а справка в PB очень скудная.

1.

Код:
$rtf = StringRegExpReplace($rtf, "\s*" & @CRLF & "*" & "(\\cell|\\par)", "\1") 

@CRLF - это символ новой строки 
\\cell = \cell (бекслеш экранируется)


Пишу на PB:
Код:
  If CreateRegularExpression(0, "\s*\n*(\\cell|\\par)")
    rtf.s = ReplaceRegularExpression(0, rtf.s, "\1")
  EndIf
но он найденный текст меняет не на первую скобку, а на символы "\1" :(




2.

Код:
$rtf = StringRegExpReplace($rtf, "\\ldblquote\s*" & @CRLF, " """ & @CRLF) 

" """ - обозначает пробел+кавычка



3.

Код:
While StringRegExp($rtf, @CRLF & "([^\\]+?)" & @CRLF) = 1 
$rtf = StringRegExpReplace($rtf, @CRLF & "([^\\]+?)" & @CRLF, @CRLF & "\1") 
WEnd
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Регэкспы в РВ не поддерживают обратные ссылки при замене (3 параметр в StringRegExpReplace), тут - либо писать свою функцию StringRegExpReplace, либо - не использовать в третьем параметре обратные ссылки (типа \1)

по второму пункту:

Код:
pattern.s = "\\ldblquote\s*"
replacement.s = " " + Chr(34)
regex = CreateRegularExpression(#PB_Any, pattern)
If regex
	rtf$=ReplaceRegularExpression(regex, rtf$, replacement)
	FreeRegularExpression(regex)
EndIf
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
asdf8

asdf8 [?]
Регэкспы в РВ не поддерживают обратные ссылки при замене

Ничего себе. Зачем тогда нужны эти регексы? :( Мне казалось, что там PCRE стоит, а он поддерживать должен.
А как можно это обойти? Т.е. мне нужно делать обратные ссылки на совпадения в скобках.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Да там PCRE стоит, но, я уже писал, что регэкспы в РВ сильно недоделанные.

А как можно это обойти?

на http://www.purebasic.fr/english/ когда-то видел тему, где пытались решить этот вопрос - вопрос решили, но как-то криво, хотя для твоего случая, я думаю, подойдет - поищи.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Нашел это "решение"

Код:
ImportC "" 
  pcre_exec(*pcre,*extra,subject.s,length,startoffset,options,*ovector,ovecsize)
EndImport

Procedure.s BackrefReplaceRegularExpression( regexp_handle , string.s , replacement.s )
   Static Dim pcre_results(12)
   While pcre_exec(PeekL(regexp_handle),0,string,Len(string),pcre_results(1),0,@pcre_results(),12) > 0
      rpl.s = replacement
      p=pcre_results(0)
      q=pcre_results(1)
      If FindString(replacement,"\1",1)
         p1=pcre_results(2)
         q1=pcre_results(3)
         rpl=ReplaceString(rpl,"\1",PeekS(@string+p1,q1-p1)) 
      EndIf
      If FindString(replacement,"\2",1)
         p1=pcre_results(4)
         q1=pcre_results(5)
         rpl=ReplaceString(rpl,"\2",PeekS(@string+p1,q1-p1)) 
      EndIf
      If FindString(replacement,"\3",1)
         p1=pcre_results(6)
         q1=pcre_results(7)
         rpl=ReplaceString(rpl,"\3",PeekS(@string+p1,q1-p1)) 
      EndIf
      string=Left(string,p)+rpl+Right(string,Len(string)-q) 
   Wend 
   ProcedureReturn string
EndProcedure


rh = CreateRegularExpression(0," t(.*?)e(.*?) ")

Debug BackrefReplaceRegularExpression(rh,"As they functions tried importing them through the tipteptop","_.T\1E\2._")

регулярные выражение в PureBasic не то что недоделанные, а просто детсадовские какие-то :(
 
Верх