Страницы

Поиск по вопросам

Показаны сообщения с ярлыком замена. Показать все сообщения
Показаны сообщения с ярлыком замена. Показать все сообщения

понедельник, 30 марта 2020 г.

Регулярное выражение поиск от и до. Notepad++

#регулярные_выражения #поиск #замена


Есть такой код:

{
version 0
1.000000
0.835000
0.190000
}
{
version 1
    diffuse_cube = diffuse.dds
    specular_cube = Art.dds
    hor_angle = 3.141590
    vert_angle = 0.364425
    env_brightness = 0.21
    attenuation = 0.0357142857142857
    water = 0.107142857142857
}
false
0.004015
""
1
    "FogExp" "-346.250000 2817.500000 0.133250 4.123750 0.391750 0.325000 0.325000 "
false

{
version 0
1.000000
0.835000
0.190000
}

{
version 1
    iveness = 0.050000
    wind = 0.226195
    swell = 0.400000
    period = 0.046286
}


Задача найти и удалить все блоки version 1

{
version 1
}


Исключая блоки version 0

{
version 0
}


Пока что дошел до такого выражения:
"version 1.*?[}]"
Но мне надо также захватить и верхнюю фигурную скобку.
Код в блоках может быть совершенно разным, но "version 1" всегда есть.
    


Ответы

Ответ 1



Попробуйте — \{\Rversion 1[^\}]*\}

вторник, 17 марта 2020 г.

Замена данных в TCP пакете

#java #замена #tcp


В общем, есть два устройства.
Одно отсылает пакеты, а другое, соответственно, их принимает, изменяет и дальше отправляет
в сеть. 

И тут еще суть в том, что нужно оставить заголовки пакета, окончание, а содержимое
заменить на другое. 

То есть что получается: мне нужно поднять сервер, получить пакет, убрать из него
содержимое и вставить своё. Отправить пакет дальше. Даже схемка есть: 

Вот - N - это количество "D".



Не понимаю, с чего начинать, т.к. с этим сталкиваюсь в первый раз. И хотелось бы
понять, что нарисовано на картинке.
    


Ответы

Ответ 1



Тут вроде ничего сложного. На картинке показана структура 2-х пакетов: Сообщение, которое к вам приходит. Сообщение, которое вы должны отослать. По каждому сообщению подробно расписана структура следования байтов (Б1, Б2 и т.д.), также показано, какую часть и куда нужно переносить. Тело исходного сообщения состоит из массива данных структуры "D", каждый элемент по 6 байт. Но я сейчас какие-то прописные истины перечислил)), которые вы и сами, наверное, поняли) Но вот что мне не понятно по этому рисунку: Во-первых, "Измерительное сообщение 98 байт максимум" - следовательно, пакет нефиксированной длины, а как мы узнаем об окончании пакета? + не хватает 10 байт в описании, максимум 98, а на картинке расписано только 88 байт. Может, еще есть какая-нибудь информация? Во-вторых, тело исходного сообщения на картинке 84 байта, а уместить его нужно в 103 байта, с ним производятся какие-то манипуляции? Или нужно добивать нулями до определенной длинны? =============================================== Все еще остаются вопросы) вот смотрите примерный алгоритм На вашем сервере(на рис - прибор 2), считываем поток байт, для начала берем первый байт и сверяем заголовок, судя по рисунку заголовок всегда 23 если да то продолжаем читать, если нет то нужно больше информации о других пакетах и дальнейших действиях Теперь когда мы поняли что за пакет, нам нужно узнать остальные данные, для этого нужно понять длинну пакета, и тут опять непонятно как ее вычислить она всегда фиксирована и равна = 113 байт ( тогда вам нужно считать еще 110 байт + crc(2 байта) ), или "N" - это количество D, как говорил @avp, тогда вам нужно считать еще один байт, будем считать что это count, тогда формула будет такая count * 6 + crc( 2 байта ) Когда вы получили тело сообщения, нужно сверить crc ( последние 2 байта), но тут не написано для какой части сообщения его сверять? Если crc совпал то теперь можно формировать новый пакет, но как его формировать тоже не совсем понятно

Ответ 2



Короче, вот что я сумел настрогать: Вот прибор 1: import java.io.*; import java.net.*; import java.util.*; import java.nio.ByteBuffer; import java.math.BigInteger; class TCPClient { public static void main(String argv[]) throws Exception { Random rand = new Random(); int[] keys = {20, 1480, 70, 1520, 1470, 60, 0, -16, -15, -14}; float[] values = {0.000f, 0.000f, 0.000f, 0.000f, 0.006f, 0.000f, 0f, 22.150f, 744.301f, 41.136f}; byte[] bots = new byte[88]; byte[] one_byte = new byte[4]; //one_byte = intToByteArray(023, 1); bots[0] = intToByteArray(23, 1)[0]; bots[1] = intToByteArray(14, 1)[0]; for(int i=2, key_store = 0; i < 81; i++, key_store++) { one_byte = intToByteArray(keys[key_store], 2); // код ЗХВ bots[i++] = one_byte[0]; bots[i++] = one_byte[1]; one_byte = FloatToByteArray(values[key_store]); // отчет float bots[i++] = one_byte[0]; bots[i++] = one_byte[1]; bots[i++] = one_byte[2]; bots[i++] = one_byte[3]; } one_byte = intToByteArray(rand.nextInt(), 2); // код CRC 16 bots[86] = one_byte[0]; bots[87] = one_byte[1]; for(int i=0; i < 88; i++) { System.out.print(bots[i] + " "); } Socket socket = new Socket("localhost", 6789); DataOutputStream outToServer = new DataOutputStream(socket.getOutputStream()); BufferedReader inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream())); outToServer.write(bots); int bytesWritten = outToServer.size(); System.out.println("Total " + bytesWritten + " bytes are written to stream."); String modifiedSentence = inFromServer.readLine(); System.out.println("FROM SERVER: " + modifiedSentence); socket.close(); } public static byte[] FloatToByteArray(float value) { int bits = Float.floatToIntBits(value); byte[] bytes = new byte[4]; bytes[0] = (byte)(bits & 0xff); bytes[1] = (byte)((bits >> 8) & 0xff); bytes[2] = (byte)((bits >> 16) & 0xff); bytes[3] = (byte)((bits >> 24) & 0xff); return bytes; } public static byte[] intToByteArray(int value, int length) { if(length == 2) { byte[] data = new byte[2]; data[0] = (byte) (value & 0xFF); data[1] = (byte) ((value >> 8) & 0xFF); return data; } else { BigInteger bigInt = BigInteger.valueOf(value); return bigInt.toByteArray(); } } static int crc16(final byte[] buffer) { int crc = 0xFFFF; for (int j = 0; j < buffer.length ; j++) { crc = ((crc >>> 8) | (crc << 8) )& 0xffff; crc ^= (buffer[j] & 0xff);//byte to int, trunc sign crc ^= ((crc & 0xff) >> 4); crc ^= (crc << 12) & 0xffff; crc ^= ((crc & 0xFF) << 5) & 0xffff; } crc &= 0xffff; return crc; } } Как я думаю, как оно работает: первые 2 байта - кодирую int в byte и записываю. Дальше идут структуры "D", содержащие по 6 байт, где первые 2 байта ключ, а остальные 4 - значение. Ну и в конце код CRC. Но что получается, на устройстве 2 я принимаю запрос так: Socket connectionSocket = welcomeSocket.accept(); BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); while ((i = inFromClient.read()) != -1) { } и получаю int значение, когда должно приходить byte, отправлял же в byte. Что делать? Вообще правильно?

воскресенье, 26 января 2020 г.

Удаление пробелов на PHP

#php #замена


str_replace('  ', '', $string);
str_replace('   ', '', $string);
str_replace('    ', '', $string);

Как мне заменять более двух пробелов одним кодом на ничего('')? 
trim() не предлагать, это не то.    


Ответы

Ответ 1



Регекспом: $string=preg_replace('/ {3,}/','',$string); /* | | || | |_в $string | | || |_на пустую строку | | ||_и более раз | | |_встреченный 3 | |_пробел (только пробел, для табов и пр символов - \s |_заменить */

суббота, 4 января 2020 г.

Замена символов в строке

#cpp #парсер #символы #замена


У меня есть строка: "''Start''".
После всех действий над ней, должно получиться: "Start". Т.е удаляются все символы
",  а затем все пары символов '' заменяются на ".
Удаляю из нее все символы ":
result.erase(std::remove(result.begin(), result.end(), '"' ), result.end());

Затем нужно заменить все пары символов '' на ":
replace(result.begin(), result.end(), "\'\'", "\"");

Выдает ошибку следующую ошибку: 

tools/data_parser.cpp: In function ‘int main(int, const char**)’:
tools/data_parser.cpp:21:52: error: no matching function for call to ‘replace(std::__cxx11::basic_string::iterator,
std::__cxx11::basic_string::iterator, const char [3], const char [2])’
  replace(result.begin(), result.end(), "\'\'", "\"");
                                                    ^
In file included from /usr/include/c++/5/algorithm:62:0,
                 from tools/data_parser.cpp:7:
/usr/include/c++/5/bits/stl_algo.h:4233:5: note: candidate: template void std::replace(_FIter, _FIter, const _Tp&, const _Tp&)
     replace(_ForwardIterator __first, _ForwardIterator __last,
     ^
/usr/include/c++/5/bits/stl_algo.h:4233:5: note:   template argument deduction/substitution
failed:
tools/data_parser.cpp:21:52: note:   deduced conflicting types for parameter ‘const
_Tp’ (‘char [3]’ and ‘char [2]’)
  replace(result.begin(), result.end(), "\'\'", "\"");


Я так понимаю, что std::replace заменяет только один символ на другой. Как заменить
пару символов? Компилирую так: g++-5 -std=c++11 cfg_parser.cpp -o cfg_parser
    


Ответы

Ответ 1



Если я вас правильно понял, то вы можете выполнить задачу следующим образом #include #include #include int main() { std::string s( "\"''Start''\"" ); std::cout << '[' << s << ']' << std::endl; s.erase( std::remove( s.begin(), s.end(), '"' ), s.end() ); for ( std::string::size_type n = 0; ( n = s.find( "''", n ) ) != std::string::npos; ++n ) { s.replace( n, 2, 1, '"' ); } std::cout << '[' << s << ']' << std::endl; } Программа имеем следующий вывод на консоль: ["''Start''"] ["Start"]

Ответ 2



Просто, быстро и (надеюсь) надежно #include #include char * replq (char *str) { int i, j; for (i = j = 0; str[i]; i++) if (str[i] != '"') { if (str[i] == '\'' && str[i + 1] == '\'') { str[j++] = '"'; i++; } else str[j++] = str[i]; } str[j] = 0; return str; } int main (int ac, char *av[]) { char str[1000]; while (fgets(str, 1000, stdin)) puts(replq(str)); return puts("End") == EOF; } По поводу Си -- конечно это Си (но g++ признает код своим, т.е. крестовым).

Ответ 3



std::replace действительно заменяет лишь символы. Вам нужно воспользоваться string::replace. string haystack = "''text''"; string needle = "''"; size_t pos; while ((pos = haystack.find(needle)) != haystack.npos) haystack.replace(pos, pos + needle.length(), "\""); Проверка: http://ideone.com/zxa0Rn Впрочем, это по сути не отличается от варианта @Vlad from Moscow

Ответ 4



/*********************************************************** * Method: fn_Replace * Description Замена одного символа в строке на один символ или строку * Returns: void * Parameter: wstring & ws - исходная строка * Parameter: const wchar_t wchF - один заменяемый символ * Parameter: LPCTSTR wchR - замена, символ или строка символов ************************************************************/ void fn_Replace(wstring& ws, const wchar_t wchF, LPCTSTR wchR) { size_t sz = ws.size(); for(size_t i = 0; i < sz; ++i) { if(ws[i] != wchF) continue; else ws.replace(i,1,wchR); } }

суббота, 30 ноября 2019 г.

Как в C# заменить " кавычки на « »

#c_sharp #строки #замена


Есть строка: 

ООО "Парус"


Как заменить в ней кавычки типа " на кавычки типа » и « соответственно?
    


Ответы

Ответ 1



По идее, нужно заменять кавычки, которые стоят перед словами на открывающие, а после слов - на закрывающие. Что-то вроде этого (возможно, можно упростить код): var s = "ООО \"Парус\" и ООО \"НПП \"Рога и копыта\""; var s2 = Regex.Replace(s, "\"(\\w+)", "«$1"); var s3 = Regex.Replace(s2, "(\\w+)\"", "$1»"); Console.WriteLine(s3);

Ответ 2



Для решения можно воспользоваться Regex.Replace Для получения нужной части строки, которую надо заменить, можно использовать следующее регулярное выражение "(.+?)" В этом случае текст между кавычками будет сохранен в первой группе. При простой замене кавычек можно использовать перегрузку со строкой: var result = Regex.Replace(source, "\"(.+?)\"", "«$1»") Если нужны какие-то дополнительные операции, можно воспользоваться перегрузкой принимающей MatchEvaluator: var result = Regex.Replace(source, "\"(.+?)\"", m => { return $"«{m.Groups[1]}»"; });

Ответ 3



Вот еще один вариант: string res = Regex.Replace("ООО \"Парус\" и ОАО \"Рога и копыта\"", "\"(\\w[\\w ]*\\w)\"", @"«$1»"); MessageBox.Show(res, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); Это способ с более строгими условиями поиска, попробуйте несколько вариантов: "\"(\\w[\\w ]*\\w)\"" - названия фирм могут включать в себя буквы и цифры (класс символов "\w"), и состоять из нескольких слов (конструкция "[\\w ]*") "\"(\\a[\\a ]*\\a)\"" - этот шаблон аналогичен предыдущему, но в отличии от первого не допускает наличия в названиях фирм цифр ("\\a"). "\"(\\p{IsCyrillic}[\\p{IsCyrillic} ]*\\p{IsCyrillic})\"" - названия фирм могут быть только на кириллице ("\\p{IsCyrillic}"). Можете также попробовать использовать такой класс символов "\\p{Lu}" он задает множество заглавных букв. Однако, иногда возникают ситуации требующие нетривиального подхода, например в подобной ситуации: ООО "Научно-производственное предприятие "ГАРАНТ-СЕРВИС-УНИВЕРСИТЕТ" Регулярные выражения "из коробки" практически не применимы, однозначного решения для подобных ситуаций не существует. Решение иногда все удается найти, например можно ограничит размер подстроки с названием фирмы использовав квантор {n,м}, он означает что предыдущий элемент должен повторяется как минимум n раз, но не более чем m раз. И добавить более точные признаки указывающие на начала искомого фрагмента, в данном случае это конечный набор слов указывающих на тип юр. лица ("ООО", "ОАО", "ЗАО" и т.д.). А вложенные кавычкам внутри названия можно выделить простым паттерном "\s«\w". Вот примера такого кода: string src = "ООО \"Парус\" и ОАО \"Рога и копыта\" при согдействии "+ "ООО \"Научно-производственное предприятие "+ "\"ГАРАНТ-СЕРВИС-УНИВЕРСИТ бла бла бл\" "; string res = Regex.Replace(src, "(ООО/ЗАО/ОАО]\s]9", @"$1«"); res = Regex.Replace(res, "\"(\\w[\\w \\-«]*\\w)\"", @"«$1»"); MessageBox.Show(res, "Error", MessageBoxButtons.OK, MessageBoxIcon.Information); источник: https://msdn.microsoft.com/ru-ru/library/az24scfc(v=vs.110).aspx#character_classes

четверг, 6 июня 2019 г.

Замена данных в TCP пакете

В общем, есть два устройства. Одно отсылает пакеты, а другое, соответственно, их принимает, изменяет и дальше отправляет в сеть.
И тут еще суть в том, что нужно оставить заголовки пакета, окончание, а содержимое заменить на другое.
То есть что получается: мне нужно поднять сервер, получить пакет, убрать из него содержимое и вставить своё. Отправить пакет дальше. Даже схемка есть:
Вот - N - это количество "D".

Не понимаю, с чего начинать, т.к. с этим сталкиваюсь в первый раз. И хотелось бы понять, что нарисовано на картинке.


Ответ

Тут вроде ничего сложного. На картинке показана структура 2-х пакетов: Сообщение, которое к вам приходит. Сообщение, которое вы должны отослать. По каждому сообщению подробно расписана структура следования байтов (Б1, Б2 и т.д.), также показано, какую часть и куда нужно переносить. Тело исходного сообщения состоит из массива данных структуры "D", каждый элемент по 6 байт. Но я сейчас какие-то прописные истины перечислил)), которые вы и сами, наверное, поняли) Но вот что мне не понятно по этому рисунку: Во-первых, "Измерительное сообщение 98 байт максимум" - следовательно, пакет нефиксированной длины, а как мы узнаем об окончании пакета? + не хватает 10 байт в описании, максимум 98, а на картинке расписано только 88 байт. Может, еще есть какая-нибудь информация? Во-вторых, тело исходного сообщения на картинке 84 байта, а уместить его нужно в 103 байта, с ним производятся какие-то манипуляции? Или нужно добивать нулями до определенной длинны? =============================================== Все еще остаются вопросы) вот смотрите примерный алгоритм На вашем сервере(на рис - прибор 2), считываем поток байт, для начала берем первый байт и сверяем заголовок, судя по рисунку заголовок всегда 23 если да то продолжаем читать, если нет то нужно больше информации о других пакетах и дальнейших действиях Теперь когда мы поняли что за пакет, нам нужно узнать остальные данные, для этого нужно понять длинну пакета, и тут опять непонятно как ее вычислить она всегда фиксирована и равна = 113 байт ( тогда вам нужно считать еще 110 байт + crc(2 байта) ), или "N" - это количество D, как говорил @avp, тогда вам нужно считать еще один байт, будем считать что это count, тогда формула будет такая count * 6 + crc( 2 байта ) Когда вы получили тело сообщения, нужно сверить crc ( последние 2 байта), но тут не написано для какой части сообщения его сверять? Если crc совпал то теперь можно формировать новый пакет, но как его формировать тоже не совсем понятно

понедельник, 4 февраля 2019 г.

Замена символов в строке

У меня есть строка: "''Start''". После всех действий над ней, должно получиться: "Start". Т.е удаляются все символы ", а затем все пары символов '' заменяются на " Удаляю из нее все символы " result.erase(std::remove(result.begin(), result.end(), '"' ), result.end());
Затем нужно заменить все пары символов '' на " replace(result.begin(), result.end(), "\'\'", "\"");
Выдает ошибку следующую ошибку:
tools/data_parser.cpp: In function ‘int main(int, const char**)’: tools/data_parser.cpp:21:52: error: no matching function for call to ‘replace(std::__cxx11::basic_string::iterator, std::__cxx11::basic_string::iterator, const char [3], const char [2])’ replace(result.begin(), result.end(), "\'\'", "\""); ^ In file included from /usr/include/c++/5/algorithm:62:0, from tools/data_parser.cpp:7: /usr/include/c++/5/bits/stl_algo.h:4233:5: note: candidate: template void std::replace(_FIter, _FIter, const _Tp&, const _Tp&) replace(_ForwardIterator __first, _ForwardIterator __last, ^ /usr/include/c++/5/bits/stl_algo.h:4233:5: note: template argument deduction/substitution failed: tools/data_parser.cpp:21:52: note: deduced conflicting types for parameter ‘const _Tp’ (‘char [3]’ and ‘char [2]’) replace(result.begin(), result.end(), "\'\'", "\"");
Я так понимаю, что std::replace заменяет только один символ на другой. Как заменить пару символов? Компилирую так: g++-5 -std=c++11 cfg_parser.cpp -o cfg_parser


Ответ

Если я вас правильно понял, то вы можете выполнить задачу следующим образом
#include #include #include
int main() { std::string s( "\"''Start''\"" );
std::cout << '[' << s << ']' << std::endl;
s.erase( std::remove( s.begin(), s.end(), '"' ), s.end() );
for ( std::string::size_type n = 0; ( n = s.find( "''", n ) ) != std::string::npos; ++n ) { s.replace( n, 2, 1, '"' ); }
std::cout << '[' << s << ']' << std::endl; }
Программа имеем следующий вывод на консоль:
["''Start''"] ["Start"]

четверг, 4 октября 2018 г.

Как в C# заменить " кавычки на « »

Есть строка:
ООО "Парус"
Как заменить в ней кавычки типа " на кавычки типа » и « соответственно?


Ответ

По идее, нужно заменять кавычки, которые стоят перед словами на открывающие, а после слов - на закрывающие. Что-то вроде этого (возможно, можно упростить код):
var s = "ООО \"Парус\" и ООО \"НПП \"Рога и копыта\""; var s2 = Regex.Replace(s, "\"(\\w+)", "«$1"); var s3 = Regex.Replace(s2, "(\\w+)\"", "$1»"); Console.WriteLine(s3);