RE-MATCH с пробельными символами

Обсуждение программ nnCron и nnCron LITE

RE-MATCH с пробельными символами

Postby YNik » Thu, 31 Jul 2014, 17:11

Здравствуйте!
Имеется файл вида:
Code: Select all
   Yes   |0   |      %windir%\Temp                                       |   *.*   
   No   |10   |   %FOLDER-APP-DATA%\Microsoft\Office                              |*.tmp
   Yes   |20   |   %windir%\system32                                          |   *.log   
   Yes   |30   |   %FOLDER-APP-DATA%\Microsoft\Office                              |   *.tmp   


Вертикальные черточки "|" - разделитель, перед и после значений любое количество пробелов/табуляторов

При выполнении задачи
Code: Select all
#( Test_02
NoActive
\ NoLog
\ SingleInstance
\ AsLoggedUser
\ Time: * * * * * *

USER-VALUE list-contents
USER-VALUE list-file
\ максимальная длина строки (в символах)
10240 CONSTANT max-line-size
Action:
  \ Построчно (в цикле) считываем файл
\ test.txt в переменную list-contents и
\ выводим каждую строчку на экран.

    \ Зарезервировали достаточное количество памяти
    \ и записали ее адрес в list-contents   
    max-line-size ALLOCATE THROW TO list-contents
    S" clear.lst" R/O OPEN-FILE-SHARED THROW TO list-file
    BEGIN list-contents max-line-size 2- list-file READ-LINE THROW WHILE
    \ На стеке осталось число прочитанных символов.
    \ Прибавляем его к адресу зарезервированной памяти
    \ и дописываем 0, чтобы получить zero-terminated string
    list-contents + 0 SWAP C!
   RE-MATCH: "%list-contents ASCIIZ>%" "/\s*(Yes)\s*\|\s*(\d+)\s*\|\s*(.+)\s*\|\s*(.+)\s*/ix"
    IF
         MSG: "$1=%$1%++%crlf%$2=%$2%++%crlf%$3=%$3%++%crlf%$4=%$4%++"
\   ELSE MSG: "ELSE"
   THEN
    REPEAT
    DROP
    list-file CLOSE-FILE DROP
    list-contents FREE DROP

 
)#


переменные %$1% и %$2% выводят значения без пробелов и табуляторов в начале и конце, так и нужно,
а вот переменные %$3% и %$4% выводят значения без пробелов и табуляторов в начале но в конце "\s*", почемуто не работает.
Помогите.

И еще, как бы "развернуть" переменную %$3% (%windir%) в строку вида в C:\Windows\и.д
YNik
 
Posts: 7
Joined: Tue, 01 Jul 2014, 18:53

Re: RE-MATCH с пробельными символами

Postby Morituruz » Thu, 31 Jul 2014, 17:52

YNik wrote:перед и после значений любое количество пробелов/табуляторов

YNik wrote:переменные %$1% и %$2% выводят значения без пробелов и табуляторов

однако в регулярном выражении обрабатываются только пробелы, без табуляторов (\t)

YNik wrote:но в конце "\s*", почемуто не работает.

Это потому, что точка это любой символ, в том числе и пробел. Используйте или нежадную точку: (.+?), или конкретно указываете, что не хотите пробелы и табуляторы: ([^\s\t]+)
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: RE-MATCH с пробельными символами

Postby YNik » Thu, 31 Jul 2014, 20:47

Morituruz wrote:однако в регулярном выражении обрабатываются только пробелы, без табуляторов (\t)

Спасибо,
Однако
\s Пробел (tab/space/cr/lf) из HELPa
\s Любой знак пробела. В число таких знаков входит пробел, табуляция и перевод страницы. [ \f\n\r\t\v] из msdn.microsoft.com
Morituruz wrote:Используйте или нежадную точку: (.+?)

Да, тут жадность фраера сгубила.
В результате получилось вот так

/\s*(Yes)\s*\|\s*(\d+)\s*\|\s*(.+?)\s*\|\s*([^\s]+)/i

Осталось разобраться с
YNik wrote:И еще, как бы "развернуть" переменную %$3% (%windir%) в строку вида в C:\Windows\и.д
YNik
 
Posts: 7
Joined: Tue, 01 Jul 2014, 18:53

Re: RE-MATCH с пробельными символами

Postby VoidVolker » Thu, 31 Jul 2014, 22:47

YNik wrote:И еще, как бы "развернуть" переменную %$3% (%windir%) в строку вида в C:\Windows\и.д

Code: Select all
S" windir" ENV
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: RE-MATCH с пробельными символами

Postby ANR Daemon » Fri, 01 Aug 2014, 06:25

А инверсные классы оно понимает? \S например.
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59

Re: RE-MATCH с пробельными символами

Postby YNik » Fri, 01 Aug 2014, 20:53

VoidVolker wrote:
Code: Select all
S" windir" ENV

Прошу прощения, я наверно не внятно описал.
Начну с начала.
В первом посте приведен файл содержащий четыре "столбца"

Code: Select all
Yes|0  |%windir%\Temp                     |*.*
No |10 |%FOLDER-APP-DATA%\Microsoft\Office|*.tmp

разделитель столбцов - "|" вертикальная черта.
Третья столбец - перечень директорий подлежащих очистке.

Code: Select all
%windir%\Temp
%FOLDER-APP-DATA%\Microsoft\Office


В задаче READ-LINE построчно читает файл и регулярным выражением разбывает строку из файла на переменные
%$1%, %$2%, %$3% и %$4%.
До сих пор получилось.

Переменная %$3% содержит строки
Code: Select all
%windir%\Temp
%FOLDER-APP-DATA%\Microsoft\Office
и так далее.

Вопрос состоит в следующем, как собственно эти строки (содержащие %windir%, %FOLDER-APP-DATA% и другие переменные)
передать на обработку в PURGE-OLD, FILE-DELETE, DIR-DELETE....
Если можно то цитату пошире.

Спасибо.
YNik
 
Posts: 7
Joined: Tue, 01 Jul 2014, 18:53

Re: RE-MATCH с пробельными символами

Postby VoidVolker » Fri, 01 Aug 2014, 21:57

Code: Select all
S" %windir%\Temp" EVAL-SUBST PURGE-OLD
S" %FOLDER-APP-DATA%\Microsoft\Office" EVAL-SUBST DIR-DELETE
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: RE-MATCH с пробельными символами

Postby YNik » Sat, 02 Aug 2014, 08:36

Code: Select all
RE-MATCH: "%list-contents ASCIIZ>%" "/\s*(Yes)\s*\|\s*(\d+)\s*\|\s*(.+?)\s*\|\s*([^\s]+)/i"
    IF

\  S" %windir%\Temp\*.log" EVAL-SUBST 1 PURGE-OLD 
  S" %$3%\*.tmp" EVAL-SUBST 1 PURGE-OLD

   THEN

Строка
S" %windir%\Temp\*.log" EVAL-SUBST 1 PURGE-OLD - срабатывает
а строка
S" %$3%\*.tmp" EVAL-SUBST 1 PURGE-OLD - не срабатывает (в папке C:\Windows\Temp ничего не удаляется)
YNik
 
Posts: 7
Joined: Tue, 01 Jul 2014, 18:53

Re: RE-MATCH с пробельными символами

Postby VoidVolker » Sat, 02 Aug 2014, 09:05

А что в $3? Еще одна подстрока? Тогда, после
Code: Select all
S" %$3%\*.tmp" EVAL-SUBST
получается вот что:
Code: Select all
%windir%\Temp\*.tmp

Т.е. надо либо дважды EVAL-SUBST делать, либо:
Code: Select all
$3 EVAL-SUBST S" \*.tmp" S+
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: RE-MATCH с пробельными символами

Postby YNik » Sat, 02 Aug 2014, 09:25

Да,
Code: Select all
  S" %$3%\%$4%" EVAL-SUBST EVAL-SUBST -1 PURGE-OLD

помогло! Спасибо!
YNik
 
Posts: 7
Joined: Tue, 01 Jul 2014, 18:53


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 1 guest

cron