Почему это регулярное выражение терпит неудачу в Matlab (но не в Octave или regex101.com)? - PullRequest
0 голосов
/ 20 ноября 2018

Я разработал регулярное выражение (на основе Как использовать регулярное выражение Python для соответствия синтаксису функции MATLAB? ), чтобы попытаться получить входные и выходные аргументы и имя функции из объявления функции matlab, вот регулярное выражение:

^\s*function\s+(?:(?:\[((?:\s*(?:\w+[\w0-9]*)\s*,?)+)\]|(\w+[\w0-9]*))\s*=)?[\s.]*(\w+[\w0-9]*)\s*(?:\(([^)]*)\))?

Вы можете увидеть это в действии здесь: регулярное выражение в regex101.com

В регулярном выражении regex101 работает отлично, но в In Matlabкогда я пытаюсь использовать это регулярное выражение, оно не работает должным образом, например, см. следующий сеанс matlab:

K>> argstr = 'function loss = conductionLo7ss (self, Irms, m, DPF)'

argstr =

    'function loss = conductionLo7ss (self, Irms, m, DPF)'

K>> fcn_decl_regex = '^\s*function\s+(?:(?:\[((?:\s*(?:\w+[\w0-9]*)\s*,?)+)\]|(\w+[\w0-9]*))\s*=)?[\s.]*(\w+[\w0-9]*)\s*(?:\(([^)]*)\))?';
K>> [tokens, match] = regexp (argstr, fcn_decl_regex, 'tokens', 'match')

tokens =

  1×1 cell array

    {1×1 cell}


match =

  1×1 cell array

    {'function loss = conductionLo7ss (self, Irms, m, DPF)'}

K>> tokens{1}

ans =

  1×1 cell array

    {'conductionLo7ss'}

Однако в Octave он также работает нормально:

octave:8> argstr = 'function loss = conductionLo7ss (self, Irms, m, DPF)'
argstr = function loss = conductionLo7ss (self, Irms, m, DPF)
octave:9> fcn_decl_regex = '^\s*function\s+(?:(?:\[((?:\s*(?:\w+[\w0-9]*)\s*,?)+)\]|(\w+[\w0-9]*))\s*=)?[\s.]*(\w+[\w0-9]*)\s*(?:\(([^)]*)\))?';
octave:10> [tokens, match] = regexp (argstr, fcn_decl_regex, 'tokens', 'match')
tokens =
{
  [1,1] =
  {
    [1,1] = loss
    [1,2] = conductionLo7ss
    [1,3] = self, Irms, m, DPF
  }

}

match =
{
  [1,1] = function loss = conductionLo7ss (self, Irms, m, DPF)
}

В случае, если это полезно, документация для функции регулярного выражения Matlab здесь

То, что регулярное выражение на самом деле пытается захватить, это входные аргументы функции (если они есть) как единое целоеблок, выходные аргументы (если они есть) в виде одного блока и имя функции.Так, например:

`function loss = conductionLo7ss (self, Irms, m, DPF)`
Group 2.    9-13    `loss`
Group 3.    16-31   `conductionLo7ss`
Group 4.    33-51   `self, Irms, m, DPF`

или

`function [loss, arg2] = conductionLoss (self, Irms, m, DPF)`
Group 1.    63-73   `loss, arg2`
Group 3.    77-91   `conductionLoss`
Group 4.    93-111  `self, Irms, m, DPF`

, чтобы привести два примера

...