The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Возможно ли на regexp perl удалить определенное число байтов?, !*! zhukovia, 05-Фев-20, 13:29  [смотреть все]
Есть строка текста в которой в произвольном месте может содержаться "мусорный" текст который нужно вычистить. У "мусора" следующие параметры он оканчивается на \x00\x00 (в hex представлении), а в начале \xE3\x33 но при этом он не всегда находится в самом начале иногда перед ним бывает 1 или 2 символа. При этом длинна "мусорной" строки всегда 70 байт. Встречается "мусор" произвольное число раз.

Возможно ли на Perl составить такое регулярное выражение или два три выражения которое удаляло бы ненужное?


  • Возможно ли на regexp perl удалить определенное число байтов?, !*! zhukovia, 13:41 , 05-Фев-20 (1)
    Забыл добавить подобная последовательность (\x00\x00) может быть не один раз внутри "мусора". И начинается не строго с \xE3\x33. В начале бывает еще 1-2 символа произвольных, но длинна всегда 70 байт.

    • Возможно ли на regexp perl удалить определенное число байтов?, !*! Pahanivo, 14:10 , 05-Фев-20 (2) +1
      > Забыл добавить подобная последовательность (\x00\x00) может быть не один раз внутри "мусора".
      > И начинается не строго с \xE3\x33. В начале бывает еще 1-2
      > символа произвольных, но длинна всегда 70 байт.

      На перле это делается как два пальца об асфальт, остается только понять что такое "бывает 1-2 символа" и как эти два символа отличить от остальной части строки.
      Регексы требуют четкости, а не размытых формулировок.

      • Возможно ли на regexp perl удалить определенное число байтов?, !*! zhukovia, 07:23 , 06-Фев-20 (6)
        >> Забыл добавить подобная последовательность (\x00\x00) может быть не один раз внутри "мусора".
        >> И начинается не строго с \xE3\x33. В начале бывает еще 1-2
        >> символа произвольных, но длинна всегда 70 байт.
        > На перле это делается как два пальца об асфальт, остается только понять
        > что такое "бывает 1-2 символа" и как эти два символа отличить
        > от остальной части строки.
        > Регексы требуют четкости, а не размытых формулировок.

        Согласен что нужно четко описывать, но проблема в том что эти 1-2 символа никак не отличить от нормальной строки поэтому я пошел другим путем. Сначала перевернул строку, а потом искал \x00\x00 и от них уже искал 70 байт и вырезал, потом строку обратно переворачивал.
        $row = reverse($row);
        $row=~s/\x00\x00.{68}//g;
        $row = reverse($row);
        Возможно перевороты туда сюда и не оптимальны но это работает.

        • Возможно ли на regexp perl удалить определенное число байтов?, !*! Pahanivo, 12:27 , 06-Фев-20 (10)
          > Согласен что нужно четко описывать, но проблема в том что эти 1-2
          > символа никак не отличить от нормальной строки поэтому я пошел другим
          > путем. Сначала перевернул строку, а потом искал \x00\x00 и от них
          > уже искал 70 байт и вырезал, потом строку обратно переворачивал.
          > $row = reverse($row);
          > $row=~s/\x00\x00.{68}//g;
          > $row = reverse($row);
          > Возможно перевороты туда сюда и не оптимальны но это работает.

          Это сферическое "черезжопу" в вакууме.
          Внизу есть решение нарезки по 70.

  • Возможно ли на regexp perl удалить определенное число байтов?, !*! Аноним, 00:14 , 06-Фев-20 (3)
    > Есть строка текста в которой в произвольном месте может содержаться "мусорный" текст
    > который нужно вычистить. У "мусора" следующие параметры он оканчивается на \x00\x00
    > (в hex представлении), а в начале \xE3\x33 но при этом он
    > не всегда находится в самом начале иногда перед ним бывает 1
    > или 2 символа. При этом длинна "мусорной" строки всегда 70 байт.
    > Встречается "мусор" произвольное число раз.
    > Возможно ли на Perl составить такое регулярное выражение или два три выражения
    > которое удаляло бы ненужное?

    Что-то такое, если я вас верно понял.

    $clean = do{ use bytes ; $str =~ s/.{68}\x00{2}(?!=\x00)//g ; $str }

    • Возможно ли на regexp perl удалить определенное число байтов?, !*! ACCA, 01:11 , 06-Фев-20 (4)
      >> Е> Что-то такое, если я вас верно понял.
      > $clean = do{ use bytes ; $str =~ s/.{68}\x00{2}(?!=\x00)//g ; $str }

      Так оно не проверит на \xE3\x33. Нужно тщательнее:

      $clean = do{ use bytes;
        $str =~ s/\xE3\x33.{66}\x00{2}//og;
        $str =~ s/.\xE3\x33.{65}\x00{2}//og;
        $str =~ s/..\xE3\x33.{64}\x00{2}//og;
        $str }


      Три простых регекса отработают в разы быстрее одного сложного.

      • Возможно ли на regexp perl удалить определенное число байтов?, !*! Аноним, 03:31 , 06-Фев-20 (5)
        > Так оно не проверит на \xE3\x33. Нужно тщательнее:

        Если в данных не бывает \0\0, удаляемый кусок всегда 70 байт и оканчивается двумя и более \0, моего решения достаточно.
        Без конкретики в условиях лучше не переусложнять.

        > Три простых регекса отработают в разы быстрее одного сложного.

        Это не сложное выражение.

        • Возможно ли на regexp perl удалить определенное число байтов?, !*! Pahanivo, 12:20 , 06-Фев-20 (8)
          > Это не сложное выражение.

          (?!=\x00) - что это значит?
          Есть:
          (?=ххх) заглядывание вперед
          (?!xxx) заглядывание вперед с отрицанием
          а что у вас нифига не понятно, думаю что скорее второе.

          Вообще в силу формулировки афтара, его следовало бы послать ... формулировать, а не гадать не пойми на чем.

          • Возможно ли на regexp perl удалить определенное число байтов?, !*! Аноним, 00:47 , 07-Фев-20 (11)
            >> Это не сложное выражение.
            > (?!=\x00) - что это значит?
            > Есть:
            > (?=ххх) заглядывание вперед
            > (?!xxx) заглядывание вперед с отрицанием
            > а что у вас нифига не понятно, думаю что скорее второе.
            > Вообще в силу формулировки афтара, его следовало бы послать ... формулировать, а
            > не гадать не пойми на чем.

            Думал сначала написать ?=[^\x00], а потом исправил и знак равно забыл убрать. Регулярку конечно не тестил.
            Посылать неправильно. Вопрос корректный. Возможно? Возможно. Он же не попросил сразу годного в продакшен решения.

    • Возможно ли на regexp perl удалить определенное число байтов?, !*! zhukovia, 07:29 , 06-Фев-20 (7)
      > $clean = do{ use bytes ; $str =~ s/.{68}\x00{2}(?!=\x00)//g ; $str }

      (?!=\x00) как я понимаю эта конструкция будет искать \x00{2} после которых нет \x00, а в строке может быть и несколько кусков такого мусора. Так что не сработает. Я поступил в "лоб" развернул строку и искал уже с конца \x00{2} и потом резал 70 байт.


      • Возможно ли на regexp perl удалить определенное число байтов?, !*! Pahanivo, 12:26 , 06-Фев-20 (9)
        > (?!=\x00) как я понимаю эта конструкция будет искать \x00{2} после которых нет
        > \x00, а в строке может быть и несколько кусков такого мусора.

        видимо тут (?!\x00), и видимо оно будет учитывать что в мусоре \x00 не только в конце две штуки, ибо исходя из твоей формулировки мусор кончается двумя \x00, про наличие внутри ни сказано ниху ... ничего.
        > Так что не сработает. Я поступил в "лоб" развернул строку и
        > искал уже с конца \x00{2} и потом резал 70 байт.

        Это какой-то бред.

        Может сначала попытаться немного изучить perl regex? А не брать хау-ту рецепты без понимания?

      • Возможно ли на regexp perl удалить определенное число байтов?, !*! Аноним, 00:50 , 07-Фев-20 (12)
        >> $clean = do{ use bytes ; $str =~ s/.{68}\x00{2}(?!=\x00)//g ; $str }
        > (?!=\x00) как я понимаю эта конструкция будет искать \x00{2} после которых нет
        > \x00, а в строке может быть и несколько кусков такого мусора.
        > Так что не сработает. Я поступил в "лоб" развернул строку и
        > искал уже с конца \x00{2} и потом резал 70 байт.

        Да, ?!= - опечатка, должно быть ?!

        Конструкция смотрит 2 нулевых байта, после которых нет нулевых байтов, после чего удаляет их вместе с 68 байтами стоящими перед ними.
        Если \0\0 в длину удаляемой строки не входят, нужно вместо {68} написать {70}.

  • Возможно ли на regexp perl удалить определенное число байтов?, !*! U.N.Owen, 14:05 , 08-Фев-20 (16) –1
    > Есть строка текста в которой в произвольном месте может содержаться "мусорный" текст
    > он оканчивается на \x00\x00
    > (в hex представлении), а в начале \xE3\x33 но при этом он
    > не всегда находится в самом начале иногда перед ним бывает 1
    > или 2 символа. При этом длинна "мусорной" строки всегда 70 байт.

    Этому определению строки строго соответствует регексп

    (?=.{0,2}\xE3\x33).{68}\x00{2}
    Дальше понятно, или нужно разжевывать?
    • Возможно ли на regexp perl удалить определенное число байтов?, !*! ACCA, 21:06 , 10-Фев-20 (17)
      >> (в hex представлении), а в начале \xE3\x33 но при этом он
      >> не всегда находится в самом начале иногда перед ним бывает 1
      >> или 2 символа. При этом длинна "мусорной" строки всегда 70 байт.
      > Этому определению строки строго соответствует регексп
      (?=.{0,2}\xE3\x33).{68}\x00{2}

      > Дальше понятно, или нужно разжевывать?

      Ага. Разжуй две ситуации, в которых твой regex не сработал:
         1. Перед \xE3\x33 есть ОДИН символ
         2. Перед \xE3\x33 есть ДВА символа. Строка осталась 70 байтов. А ты ожидаешь 72.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру