JREPL.bat регулярное выражение замены внутри кавычек - PullRequest
0 голосов
/ 11 марта 2020

Я использую JREPL.BAT для поиска и замены указанных c экземпляров и моего регулярного выражения. У меня есть работы для поиска и замены в коде VS C, а также в нескольких редакторах регулярных выражений, которые я использовал.

CALL ./framework/config/JREPL.BAT "(Error)+\(([^()]*|\(([^()]*|\([^()]*\))*\))*\)" "Error(\"\")" /f ./dist/index.html /o

так что я ожидаю найти любой случай

Error("")

или

Error( skjdksjdskd() + "" + )

et c

Найти и заменить произведения отлично, но jrepl берет

Error( skjdksjdskd() + "" + )

и меняет его на

Error()( skjdksjdskd() + "" + )

Кто-нибудь знает с большим опытом JREPL, почему он игнорирует кавычки, а также не заменяет область ()?

1 Ответ

2 голосов
/ 11 марта 2020

JREPL - это гибридный JScript / batch, использующий CSCRIPT - хост сценария Windows.

CSCRIPT имеет внутреннее ограничение, запрещающее передачу литералов в двойных кавычках в качестве параметров - не существует escape-последовательности CSCRIPT, которая включает " литерал.

Чтобы включить литерал " в строку запроса, вместо него можно использовать \x22. Все стандартные escape-последовательности JScript могут использоваться в строке запроса. По умолчанию escape-последовательности не распознаются в строке замены.

Но вы хотите, чтобы в вашей строке замены был литерал кавычки. Для этого требуется опция /XSEQ, чтобы вы могли использовать расширенную escape-последовательность JREPL, равную \q. Существенным преимуществом этой опции является то, что вы также можете использовать расширенные escape-последовательности в строке замены. Вы также можете использовать \x22 для поиска и замены строк, если хотите, но я считаю, \q гораздо проще запомнить.

У вас есть еще одна потенциальная проблема - команда CALL удваивает все цитируемые символы, поэтому [^()] (любой символ, отличный от ( или )) становится [^^()] (любой символ, отличный от ^, ( или )). Это определенно не то, что вы хотите. По этой причине я добавил расширенную escape-последовательность \c = ^.

Поэтому я считаю, что следующий результат даст ожидаемый результат:

CALL .\framework\config\JREPL.BAT "(Error)+\(([\c()]*|\(([\c()]*|\([\c()]*\))*\))*\)" "Error(\q\q)" /xseq /f .\dist\index.html /o -

К вашему сведению - Эффект ^ начало привязки строки не повреждается удвоением каретки - вам не нужна escape-последовательность \c для начала привязки строки, потому что "^MatchStringBeginning" и "^^MatchStringBeginning" дают идентичные результаты регулярного выражения.

Вы можете получить более подробную информацию о расширенных escape-последовательностях, введя jrepl /?/xseq или jrepl /??/xseq для справки по страницам.

>jrepl /?/xseq

      /XSEQ - Enables extended escape sequences for both Search strings and
            Replacement strings, with support for the following sequences:

            \\     -  Backslash
            \b     -  Backspace
            \c     -  Caret (^)
            \f     -  Formfeed
            \n     -  Newline
            \q     -  Quote (")
            \r     -  Carriage Return
            \t     -  Horizontal Tab
            \v     -  Vertical Tab
            \xnn   -  Extended ASCII byte code expressed as 2 hex digits nn.
                      The code is mapped to the correct Unicode code point,
                      depending on the chosen character set. If used within
                      a Find string, then the input character set is used. If
                      within a Replacement string, then the output character
                      set is used. If the selected character set is invalid or
                      not a single byte character set, then \xnn is treated as
                      a Unicode code point. Note that extended ASCII character
                      class ranges like [\xnn-\xnn] should not be used because
                      the intended range likely does not map to a contiguous
                      set of Unicode code points - use [\x{nn-mm}] instead.
            \x{nn-mm} - A range of extended ASCII byte codes for use within
                      a regular expression character class expression. The
                      The min value nn and max value mm are expressed as hex
                      digits. The range is automatically expanded into the
                      full set of mapped Unicode code points. The character
                      set mapping rules are the same as for \xnn.
            \x{nn,CharSet} - Same as \xnn, except explicitly uses CharSet
                      character set mapping.
            \x{nn-mm,CharSet} - Same as \x{nn-mm}, except explicitly uses
                      CharSet character set mapping.
            \unnnn -  Unicode code point expressed as 4 hex digits nnnn.
            \u{N}  -  Any Unicode code point where N is 1 to 6 hex digits

            JREPL automatically creates an XBYTES.DAT file containing all 256
            possible byte codes. The XBYTES.DAT file is preferentially created
            in "%ALLUSERSPROFILE%\JREPL\" if at all possible. Otherwise the
            file is created in "%TEMP%\JREPL\" instead. JREPL uses the file
            to establish the correct \xnn byte code mapping for each character
            set. Once created, successive runs reuse the same XBYTES.DAT file.
            If the file gets corrupted, then use the /XBYTES option to force
            creation of a new XBYTES.DAT file. If JREPL cannot create the file
            for any reason, then JREPL silently defaults to using pre v7.4
            behavior where /XSEQ \xnn is interpreted as Windows-1252. Creation
            of XBYTES.DAT requires either CERTUTIL.EXE or ADO. It is possible
            that both may be missing from an XP machine.

            Without the /XSEQ option, only standard JSCRIPT escape sequences
            \\, \b, \f, \n, \r, \t, \v, \xnn, \unnnn are available for the
            search strings. And the \xnn sequence represents a unicode
            code point, not extended ASCII.

            Extended escape sequences are supported even when the /L option
            is used. Both Search and Replace support all of the extended
            escape sequences if both the /XSEQ and /L options are combined.

            Extended escape sequences are not applied to JScript code when
            using any of the /Jxxx options. Use the decode() function if
            extended escape sequences are needed within the code.

Окончательный ответ для этого состоит в том, чтобы экранировать кавычки и обратную косую черту как \" AND \\ при использовании CALL в Webpack-shell-plugin.

'call "./framework/config/JREPL.BAT" \"(Error)\\(([\\c()]*|\\(([\\c()]*|\\([\\c()]*\\))*\\))*\\)\" \"Error(\\q\\q)\" /xseq /f ./dist/index.html /o ./dist/indexFinal.html'
...