regex - 为什么这个正则表达式在 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`
举两个例子
解决方案
推荐阅读
- r - 使用 grepl 而不是完整字符串返回字符串的已识别部分
- node.js - Alexa 琐事游戏自定义答案槽类型无法识别错误答案
- javascript - npm 包在 IE11 中导致 SCRIPT1006: Expected ')' 错误
- java - Android Toast 在 Intent onNewIntent 之前
- node.js - 使用 node.js 创建 WordPress 页面
- javascript - 设置输入字段的值并在页面加载时提交
- oop - 当父类失去意义时,将兄弟类作为父类是一种好习惯吗?
- jestjs - jest 未定义 - 在 __mocks__ 文件夹中
- c# - 构造函数只能链接在初始化列表中,为什么
- php - 如何仅在 url 编码中对空间进行编码?