• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

Регулярное выражение для замены типов данных

Alex1983

Разработчик
Сообщения
913
Симпатии
442
#1
// Часть сообщений выделена из темы: https://safezone.cc/threads/replace...arnye-vyrazhenija-vo-mnozhestve-fajlov.29504/

Подставляет хорошо. Но мне регуярку ни как не придумать.

UInt32
Int32
(UInt32)
(Int32)
UInt32
Int32
nameFuncUInt32( )
nameFuncInt32( )
и как её составить :Dntknw:
и как мне написать что бы UInt32=UInt3232 Int32=Int32 Но при этом не затрагивало имена функций.
 
Последнее редактирование модератором:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,735
Симпатии
5,639
#2
Чем тебе вообще помешали стандартные определения для типов?

и как мне написать что бы UInt32=UInt3232 Int32=Int32 Но при этом не затрагивало имена функций.
Для этого мне хотя бы эти функции нужно видеть.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,735
Симпатии
5,639
#3
Вот кусочек из моей шпаргалки:
Код:
(?!.*(Пушкин|Онегин)).*(Антуан|Экзюпери)$
В этом примере, регулярка примет строку, если в ней будут любые слова из последней пары, и всё что угодно до них, кроме указаных первых пар слов. Если в строке будет хоть одно из слов "Пушкин", "Онегин", то регулярка строку не пропустит.

У тебя можно сделать примерно тоже. Найти уникальный признак в строке с функцией и запретить регулярке его обрабатывать.
Например, знак {, только в этом случае запрещающие слова нужно расположить в конце регулярки.

А вообще лучше по регуляркам в отдельной теме поговорить.
ЗЫ. Я не сильно хорошо в них шарю.
 

Alex1983

Разработчик
Сообщения
913
Симпатии
442
#4
Чем тебе вообще помешали стандартные определения для типов?
В C++Builder выходит ошибка, на эти типы, компилятор не знает какой тип брать. Или Привидённый тип который в исходниках, или System::UInt32.
Я на форуме на кибере спрашивал как можно это исправить,но мне ни кто и не ответил.

Для этого мне хотя бы эти функции нужно видеть.
C++:
void ConvertUInt32ToString(UInt32 value, char *s) throw();
void ConvertUInt64ToString(UInt64 value, char *s) throw();

void ConvertUInt32ToString(UInt32 value, wchar_t *s) throw();
void ConvertUInt64ToString(UInt64 value, wchar_t *s) throw();

void ConvertUInt64ToOct(UInt64 value, char *s) throw();

void ConvertUInt32ToHex(UInt32 value, char *s) throw();
void ConvertUInt64ToHex(UInt64 value, char *s) throw();
void ConvertUInt32ToHex8Digits(UInt32 value, char *s) throw();
// void ConvertUInt32ToHex8Digits(UInt32 value, wchar_t *s) throw();

void ConvertInt64ToString(Int64 value, char *s) throw();
void ConvertInt64ToString(Int64 value, wchar_t *s) throw();
Есть где в конце функции стоит, пример BlaBlaUInt32(); BlaBlaInt32();
 

Alex1983

Разработчик
Сообщения
913
Симпатии
442
#5
Пример на этой строке
Byte (*Read)(const IByteIn *p); /* reads one byte, returns 0 in case of EOF or error */
Выдаёт ошибку
[bcc32 Error] 7zTypes.h(155): E2015 Ambiguity between 'Byte' and 'System::Byte'
Full parser context
extract.cpp(17): #include Aitotalinclude\archiv\CallbackClasses.h
CallbackClasses.h(5): #include include7z\CPP\Common/IntToString.h
IntToString.h(6): #include include7z\CPP\Common/MyTypes.h
MyTypes.h(6): #include include7z\CPP\Common/../../C/7zTypes.h
7zTypes.h(154): class IByteIn
 

Alex1983

Разработчик
Сообщения
913
Симпатии
442
#6
В общем мне надо следующую замену.
Int32 на Int3232
UInt32 на UInt3232
Int64 на Int6464
UInt64 на UInt6464
Byte на Bytee

И как её составить?
 

regist

гоняюсь за туманом
Ассоциация VN/VIP
VIP
Разработчик
Сообщения
12,122
Симпатии
5,767
#7
Alex1983 написал(а):
Но они могут чередоваться пример
(UInt32)
Сама проблема это когда функция содержит это, а именно ConvertUInt32ToString или ConvertToStringUInt32 вот здесь менять не надо.
Поясни подробней, когда надо, а когда не надо менять. То есть если внутри другого слова то всегда не надо? Если внутри скобок или отдельное слова, то надо? Верно или есть какие-то условия?
 

regist

гоняюсь за туманом
Ассоциация VN/VIP
VIP
Разработчик
Сообщения
12,122
Симпатии
5,767
#8
В общем если я правильно тебя понял, то пробуй:
(\s|\()(UInt32)(\s|\))
заменить на:
$1$232$3

Пока на этом проверь, если что потом для остальных поправим.
 

Alex1983

Разработчик
Сообщения
913
Симпатии
442
#9
Да верно.
Если слова отдельные, в скобках, и если в переди есть символ (запятая, точка с запято)
 

Alex1983

Разработчик
Сообщения
913
Симпатии
442
#11
Постараюсь объяснить ещё раз
UInt32
(UInt32)
,UInt32
UInt32;

заменить на UInt3232

Так же и Int32->Int3232
Int64->Int6464
UInt64->UInt6464
Byte->Bytee
 

regist

гоняюсь за туманом
Ассоциация VN/VIP
VIP
Разработчик
Сообщения
12,122
Симпатии
5,767
#12
что то не очень
typedef$1$232$3SizeT;
Давно, не пользовался этим скриптом, последние разы им пользовался только для спец. замен. Уже забыл, word2 там не работает с регулярками.
Можно сделать замену через Notepad++ (вкладка найти в файлах и указать папку в которых делать замену), но это немного медленно работает, либо воспользоваться другой утилитой, либо попросить Драгокас ещё раз доработать утилиту и добавить для word2 работу с регулярками ))) (но насколько помню, тех. это сложно было реализовать и поэтому не сделали).

В общем пока для теста в Notepad++ сделай замену
Код:
(\s|\(|,)(UInt32)(\s|\)|;)
на
Код:
$1$232$3
Вот для наглядности скрин, как надо настроить http://i101.fastpic.ru/big/2018/0205/a5/1a21c7c5052cd58ead96646e0652d9a5.jpg
Это регулярка работает только для замены вариантов UInt32. Если она работает правильно, то потом поправим и для других замен, либо в этой перечисление добавим. Приведённые тобой примеры должна правильно обработать.

Upd. вот что значит давно не пользовался, уже отвык от этого скрипта. В общем можно и этим скриптом, но надо над регуляркой подумать и по другому написать, либо замены отдельно для каждого случая делать. Но с регуляркой было бы удобней.
 
Последнее редактирование:

Alex1983

Разработчик
Сообщения
913
Симпатии
442
#13
В Notepad++ не срабатывает, а именно находит но вставляет пробел. Как будто удаляет.
 

regist

гоняюсь за туманом
Ассоциация VN/VIP
VIP
Разработчик
Сообщения
12,122
Симпатии
5,767
#14
Да, не проверил. Замени тогда на это
$1$2_32$3
Получится UInt32_32 - думаю тебя так тоже устроит.
 

Alex1983

Разработчик
Сообщения
913
Симпатии
442
#15
Отлично.
Теперь для всех выражений.
UInt32->UInt32_32
Int32->Int32_32
Int64->Int64_64
UInt64->UInt64_64
Byte->Bytee
 

regist

гоняюсь за туманом
Ассоциация VN/VIP
VIP
Разработчик
Сообщения
12,122
Симпатии
5,767
#16
Менять соответственно
Код:
(\s|\(|,)(U?Int(16|32|64))(\s|\)|;|,)
(\s|\(|,)(Byte)(\s|\)|;)
на
Код:
$1$2_$3$4
$1$2e$3
То есть всего две регулярки. Впихивать всё в одну не стал.
При необходимости нижний прочерк сейчас можно убрать, но по-моему с ним лучше смотрится.
 
Последнее редактирование:
Сверху Снизу