Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Регулярные выражения

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

leftMIND

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
   Регулярные выражения
Обучающий материал
  • Книги    
  • Шпаргалки: от AZJIO (AutoIt3, PCRE) от Dave Child
  • wikipedia.org - Регулярные выражения на wiki  
  • edlinsoft.blogspot.com - Регулярные выражения в .NET Framework  
  • php.ru - Синтаксис регулярных выражений  
  • php.net - Синтаксис регулярных выражений  
  • regexpstudio.com - Регулярные выражения для Delphi  
    Официальные источники:
  • docs.notepad-plus-plus.org - Официальный источник Notepad++ (англ. яз.)  
  • pcre.org - Официальный справочник движка PCRE (англ. яз.)  

  •    Тестирование регулярных выражений
    Программы
    Онлайн сервисы
  • RegexBuddy - крутая и платная  
  • RegExp - бесплатно, AZJIO, PCRE, AutoIt3  
  • Expresso  
  • The Regex Coach  
  • RegExstar, Github (AutoHotKey, PCRE)
  • Обзор программ от ManHunter    
  • regexr.com здесь в Community множество готовых регулярных выражений  
  • pagecolumn.com - для javascript  
  • pagecolumn.com - для php  
  • cuneytyilmaz.com - для javascript  
  • php-include.ru - на флеш-плеере  
  • regex101.com  
  • easyregexp.ru  
  • debuggex.com - показывает структурно  

  •    Схожие темы
  • javascript регулярные выражения
  • PHP: Регулярные выражения (RegExp, Regular, eregi, preg)
  • Игра - Регулярно выражайтесь!
     
    первое сообщение темы...
    Обсуждение шапки данной темы ведётся в этой теме
    Рекомендации по составлению вопросов в данной теме:

  • Всего записей: 33 | Зарегистр. 07-04-2002 | Отправлено: 23:55 15-10-2002 | Исправлено: AZJIO, 15:18 12-02-2021
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    abitip35pro9600gt

    Цитата:
    И notepad++ не поможет?

    AkelPad со скриптом FindReplaceEx.js поможет. В скрипте присутствует возможность формировать пакеты шаблонов.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 21:07 07-06-2018
    regist123



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    abitip35pro9600gt 19:58 07-06-2018
    Цитата:
    И notepad++ не поможет?

    поможет если написать макрос. В теме по нему уже несколько раз спрашивали про подобное .

    ----------
    Раздачи и акции

    Всего записей: 7198 | Зарегистр. 20-03-2009 | Отправлено: 23:19 07-06-2018
    totnetot



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    abitip35pro9600gt
    Большинство современных редакторов текста позволяют выполнить поиск по regex`ам и заменить соответствия на текст. Я пользуюсь Sublime Text - в нём эта задача решается легче и удобней чем во многих других редакторах (почти как в специализированных программах помогающих составлять regex). По мере ввода regex выражения - осуществляется мгновенное подсвечивание соответствующего  текста. Т.е. не нужно нажимать каждый раз кнопку "Поиск" как во многих других редакторах - чтобы проверить, найдено соответствие или нет.
     
    Есть ещё вариант попроще - grepWin.

    Всего записей: 410 | Зарегистр. 16-03-2013 | Отправлено: 02:33 08-06-2018
    totnetot



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А есть ещё супер вариант - использовать скрипт AHK.
    Вот код с комментариями - любой должен разобраться.

    Код:
    #NoEnv
    #SingleInstance, force
    FileRead, text001, test00001.txt ;обрабатываемый файл
    change001 := "замена текста 001" ;текст001 который будет вставлен
    change002 := "замена текста 002" ;текст002 который будет вставлен
    text001 := RegExReplace(text001, "m)искомый regex 001", change001, number_Change, , 1) ; m) = многострочность, "искомый regex 001" - регулярное выражение regex
    text001 := RegExReplace(text001, "m)искомый regex 002", change002, number_Change, , 1)
    FileDelete, test00002.txt ;удаляем файл
    FileAppend, %text001%, test00002.txt ;сохраняем результат в новый файл
    ExitApp
     

     
    В этом коде меняем только то, что выделено жирным шрифтом. Можно продублировать строки замен и за один запуск скрипта выполнить хоть 1000 замен - что и требовалось изначально.

    Всего записей: 410 | Зарегистр. 16-03-2013 | Отправлено: 05:17 08-06-2018 | Исправлено: totnetot, 05:25 08-06-2018
    Jonmey

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    abitip35pro9600gt

    Цитата:
    Можно ли сделать последовательную замену одной командой?  
    Т.е. отдельно делаю поиск и замену, скажем  
    найти 1  
    заменить 2  
     
    найти 3  
    заменить 1  
     
    найти 2  
    заменить 3

    Без использования регулярных выражений в файле с кодировкой ANSI это можно сделать даже с помощью BАT файла следующего содержания:
     
    @echo off
    Setlocal EnableDelayedExpansion EnableExtensions
    :: Файл, в котором требуется провести замены по списку
    Set infile=file.txt
    :: Файл, в котором содержится список замен
    :: Слова в файле замены разделяются знаками |  
    :: Например:
    ::            1|2
    ::            2|3
    ::            3|2

    Set Replaces=repl.txt
    set cnt=0
    for /f "UseBackQ tokens=1,2 delims=|" %%a in ("%Replaces%") do set/a cnt+=1& set what.!cnt!=%%a& set repl.!cnt!=%%b
     
    for /F "UseBackQ tokens=* delims=," %%n in ("%infile%") do (
      set "Line=%%n"
      for /L %%c in (1,1,%cnt%) do call set "Line=%%Line:!what.%%c!=!repl.%%c!%%"
      echo !Line!>>TMP.TXT
    )
    move /y TMP.TXT "%infile%"
    pause

    Всего записей: 1377 | Зарегистр. 17-01-2011 | Отправлено: 06:12 08-06-2018 | Исправлено: Jonmey, 06:13 08-06-2018
    totnetot



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Усовершенствованный вариант скрипта AHK.
    Многострочность уже встроена.
    Заменяем выделенный жирным текст на свои значения.
    Строки regex_N и change_N - можно продолжить до бесконечности.
     

    Код:
     
    #NoEnv
    #SingleInstance, force
    file_in := "test00001.txt" ;обрабатываемый файл
    file_out := "test00002.txt" ;файл в который записываем результат обработки
    FileRead, text_1, %file_in%
    ;__________________________________________________________________
    regex_1 := "REGEX выражение 1"
    change_1 := "вставляемый текст 1"
    ;__________________________________________________________________
    regex_2 := "REGEX выражение 2"
    change_2 := "вставляемый текст 2"
    ;__________________________________________________________________
    regex_3 := "REGEX выражение 3"
    change_3 := "вставляемый текст 3"
    ;__________________________________________________________________
    regex_a = 1
    while regex_a <> ""
        {
            regex_a := "regex_"A_index
            regex_ :="m)"%regex_a%
            change_ := "change_"A_index
            text_1 := RegExReplace(text_1, regex_, %change_%, number_Change, , 1)
            _next := A_Index + 1
            regex_next := "regex_"_next
            next_ := %regex_next%
            if next_ =
                {
                    break
                }
        }
    FileDelete, %file_out%
    FileAppend, %text_1%, %file_out%
    ExitApp

    Всего записей: 410 | Зарегистр. 16-03-2013 | Отправлено: 06:35 08-06-2018 | Исправлено: totnetot, 06:43 08-06-2018
    abitip35pro9600gt



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем спасибо  большое, за проявленный интерес. Даже не ожидал такой реакции. Сегодня буду пробовать. По результатам отпишусь
     
    Добавлено:
    Значит так. БАТик замену производит, но почему-то только на "2". Т.е. все значения 1, 2 и 3 заменились на 2
     

    Цитата:
    Без использования регулярных выражений в файле с кодировкой ANSI это можно сделать даже с помощью BАT файла следующего содержания:  
     
    @echo off  
    Setlocal EnableDelayedExpansion EnableExtensions  
    :: Файл, в котором требуется провести замены по списку  
    Set infile=file.txt  
    :: Файл, в котором содержится список замен  
    :: Слова в файле замены разделяются знаками |  
    :: Например:  
    ::            1|2  
    ::            2|3  
    ::            3|2  
    Set Replaces=repl.txt  
    set cnt=0  
    for /f "UseBackQ tokens=1,2 delims=|" %%a in ("%Replaces%") do set/a cnt+=1& set what.!cnt!=%%a& set repl.!cnt!=%%b  
     
    for /F "UseBackQ tokens=* delims=," %%n in ("%infile%") do (  
      set "Line=%%n"  
      for /L %%c in (1,1,%cnt%) do call set "Line=%%Line:!what.%%c!=!repl.%%c!%%"  
      echo !Line!>>TMP.TXT  
    )  
    move /y TMP.TXT "%infile%"  
    pause


    Всего записей: 17 | Зарегистр. 10-11-2010 | Отправлено: 07:36 08-06-2018
    U235

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Не удивительно, что в итоге получаются 2-ки.
    Нужно сделать последовательно такие замены:
    2|4
    3|2
    4|3
    1|2
    Вводится промежуточный элемент 4

    Всего записей: 980 | Зарегистр. 14-12-2005 | Отправлено: 13:45 08-06-2018
    abitip35pro9600gt



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    выходит
    2
    3
    2
     
    1-исчезает
     

    Цитата:
    Не удивительно, что в итоге получаются 2-ки.  
    Нужно сделать последовательно такие замены:  
    2|4  
    3|2  
    4|3  
    1|2  
    Вводится промежуточный элемент 4  


    Всего записей: 17 | Зарегистр. 10-11-2010 | Отправлено: 13:58 08-06-2018
    U235

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А в вашем задании 1 и должно исчезать.

    Всего записей: 980 | Зарегистр. 14-12-2005 | Отправлено: 14:30 08-06-2018
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Жесть, что только не предлагают, даже батники...
    Ну, тогда если речь о простоте и понятности, и что не менее важно, о регулярках:

    Цитата:
    найти 1  
    заменить 2  
     
    найти 3  
    заменить 1  
     
    найти 2  
    заменить 3  

    powershell
    script.ps1

    Код:
    gc test.txt -enc utf8|%{$_ -replace '1','2' -replace '3','1' -replace '2','3'}|set-content test.txt -enc utf8

     
    исходный файл test.txt:

    Код:
    1234

    результат:

    Код:
    3314

    всё
     
    PS нет, не всё, объяснения по шагам из процитированного забыл:
    образец: 1234
    шаг первый: 2234
    шаг второй: 2214
    шаг третий: 3314
    Вот теперь всё

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 14:56 08-06-2018 | Исправлено: YuS_2, 14:59 08-06-2018
    abitip35pro9600gt



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    U235
    Прошу прощения - виноват, недосмотрел.
    Но с БАТ вариант отпадает - файл огромный, около 4 тысяч замен, поэтому процесс очень долгий

    Всего записей: 17 | Зарегистр. 10-11-2010 | Отправлено: 15:03 08-06-2018 | Исправлено: abitip35pro9600gt, 15:21 08-06-2018
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    abitip35pro9600gt
    тем более, powershell, ибо если файл огромный, то не каждый редактор их прожуёт... ну, в зависимости от размеров "огромности", конечно.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 15:26 08-06-2018 | Исправлено: YuS_2, 15:27 08-06-2018
    U235

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Если файл большой, то лучше использовать sed.
    (Или tr, если замена односимвольная)

    Всего записей: 980 | Зарегистр. 14-12-2005 | Отправлено: 15:33 08-06-2018
    Jonmey

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    abitip35pro9600gt

    Цитата:
    файл огромный, около 4 тысяч замен, поэтому процесс очень долгий

    Не знаю, чего там долгого, поскольку не видел сам файл.
    Но если, скажем, число замен по регэкспам измеряется миллионами, то рекомендуюю powergrep. Более 20 млн. замен за раз (пакетный режим замен [список регэкспов числом более 40] в десятках тысяч html файлов общим объемом несколько гигабайт) осуществлялись в нем за минуты на ноутбуке.

    Всего записей: 1377 | Зарегистр. 17-01-2011 | Отправлено: 19:52 08-06-2018 | Исправлено: Jonmey, 20:38 08-06-2018
    U235

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Сейчас проверил, у меня на 6-летнем ноутбуке файл из 20 млн. строк (числа в возрастающем порядке), размером 161 Мб sed обработал за 1мин. 2сек.  Замена "2" на "3".

    Код:
     sed -i 's/2/3/g' 20M.txt

    Всего записей: 980 | Зарегистр. 14-12-2005 | Отправлено: 20:15 08-06-2018
    regist123



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Раз уж после такие разнообразные варианты без текстовых редакторов, а с помощью скриптов, то добавлю ещё один ReplaceByRegular.

    ----------
    Раздачи и акции

    Всего записей: 7198 | Зарегистр. 20-03-2009 | Отправлено: 22:13 08-06-2018
    qw12



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как найти строки, содержащие символы из набора [a-z0-9\.] идущие подряд 4 и более раз?
    То есть:
    ccffffffssa
    2423........

    Но не:
    34.4.4.4.4
    dd555dd

    Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 15:52 15-06-2018 | Исправлено: qw12, 15:52 15-06-2018
    U235

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Код:
    grep '\([a-z0-9\.]\)\1\1\1'

    Всего записей: 980 | Зарегистр. 14-12-2005 | Отправлено: 18:48 15-06-2018
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    qw12

    Цитата:
    содержащие символы из набора [a-z0-9\.] идущие подряд 4 и более раз?

    т.е. 4 и более одинаковых символа...
    как-то так:

    Код:
    ([a-z0-9\.])\1{3,}

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 19:57 15-06-2018
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Регулярные выражения


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru