Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
раньше делали отдельную RegExp обработку для замены »
ну как минимум одну замену сделать придется
Код: Выделить весь код
$sArgument  = "\Q"& StringReplace($sArgument,"\E","\E\\E\Q") &"\E"
Цитата:
Хочется перестраховаться »
по стандарту - строка парсится на CMD-параметры пробелами/кавычками, далее прога своими средствами сканирует массив CMD-параметров и решает что является параметром, что значением, что параметром со значением ("/A:F") а что является нарушением синтаксиса... тут ИМХО все как раз прозрачно

насколько я понял, ты хочешь заменить стандартные спецсимволы кавычки и пробела на свои - символы начала/конца блока параметра ("/-"), внутри которого имя параметра от его значения разделяется другими спецсимволами ("=: "), не будет ли это сменой "шила на мыло" - указанные спецсимволы уже нельзя будет просто так указывать в значении параметров... например, придется брать в кавычки (вместо пробелов) ... заметь, что при этом пробел теряет свой статус и значение может включать несколько строк с экранирующими кавычками, т.е. обработку концевых символов придется проводить отдельно
Код: Выделить весь код
If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=1 /Fil\e "C:\Program Files\Some App\File" - "Name.txt" /URL:"http://google.com"'

MsgBox(64, "", _
    _GetCmdLine($CmdLineRaw, "Param") & @LF & _
    _GetCmdLine($CmdLineRaw, "URL") & @LF & _
    _GetCmdLine($CmdLineRaw, "Fil\e"))

Func _GetCmdLine($sCmdLine, $sArgument, $sParPrefix="/", $sValPrefix="=: ")
    ; Экранируем спецсимволы
    $sParPrefix = StringRegExpReplace($sParPrefix, "[-^\]", "\\1")
    $sValPrefix = StringRegExpReplace($sValPrefix, "[-^\]", "\\1")
    $sArgument  = "\Q"& StringReplace($sArgument,"\E","\E\\E\Q") &"\E"

        #Region Построение регулярного выражения
    Local $ExpandVarStrings = Opt("ExpandVarStrings", 1)

    Local $sParClassIn = '[$sParPrefix$]'   ; класс начала имени параметра
    Local $sValClassIn = '[$sValPrefix$]'   ; класс конца имени/начала значения
    Local $sAllClassEx = '[^$sParPrefix$"]' ; класс обычных символов

    Local $sRegExp = '(?i)^.*?$sParClassIn$$sArgument$(?:$sValClassIn$+((?:"[^"]*"|$sAllClassEx$+)+))?.*$'
    ConsoleWrite($sRegExp &@CRLF)

    Opt("ExpandVarStrings", $ExpandVarStrings)
    #EndRegion

    Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1')
    If @extended Then Return $sRetCmd
    Return SetError(1, 0, "NOT FOUND")
EndFunc

Последний раз редактировалось amel27, 02-12-2008 в 07:31.

Это сообщение посчитали полезным следующие участники:

Отправлено: 06:02, 02-12-2008 | #1237