首页 > 解决方案 > 为什么这个正则表达式在 Matlab 中失败(但不是 Octave 或 regex101.com)?

问题描述

我开发了一个正则表达式(基于How do I use a Python regex to match the function syntax of MATLAB?)来尝试从 matlab 函数声明中捕获输入和输出参数以及函数名称,这是正则表达式:

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

你可以在这里看到它的实际效果:regex101.com 上的正则表达式

在 regex101 它工作得很好,但是在 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`

举两个例子

标签: regexmatlaboctave

解决方案


推荐阅读