matlab 方程的正则表达式,括号内的变量数

gcmastyq  于 2023-01-13  发布在  Matlab
关注(0)|答案(1)|浏览(158)

我试着写一个正则表达式来处理一系列方程的情况,例如:

a = 2 / (1 + exp(-2*n)) - 1
a = 2 / (1 + e) - 1
a = 2 / (3*(1 + exp(-2*n))) - 1

在任何情况下,我都需要捕获外括号的内容,分别为1 + exp(-2*n)1+e3*(1 + exp(-2*n))
我可以写一个表达式来捕捉其中的一个,比如:
\(([\w\W]*?\))\)将完美地捕获1 + exp(-2*n)
\(([\w\W]*?)\)将捕获1+e
\(([\w\W]*?\))\)\)将捕获3*(1 + exp(-2*n))
但是为这么简单的东西传递三行代码看起来很愚蠢。我该如何捆绑它呢?请注意,无论如何,我将逐行处理文本(在循环中),所以你不必费心确保运算符不会贪婪地获取下一行。
编辑:也允许使用非嵌套括号:a = 2 / (1 + exp(-2*n)) - (2-5)

gab6jxml

gab6jxml1#

下面的注解代码不使用正则表达式,但在MATLAB中解析字符数组并输出包含顶级括号的项。
因此,在您的3个问题示例中,只有一组嵌套的括号,它返回最外面的括号中的术语。
在您的注解示例中,“顶级”方括号内有两个或更多(可能是嵌套的)术语,它将返回这两个术语。
其逻辑如下所示,更多细节请参见注解

  • 找到左(左)和右(右)方括号
  • 根据公式char中每个点的未闭括号数生成“嵌套级别”
  • 找出嵌套层次变化的索引。我们感兴趣的是嵌套层次增加到1的左括号和从1开始减少的右括号。
  • 从这些索引中提取术语
e = { 'a = 2 / (1 + exp(-2*n)) - 1'
      'a = 2 / (1 + e) - 1'
      'a = 2 / (3*(1 + exp(-2*n))) - 1'
      'a = 2 / (1 + exp(-2*n)) - (2-5)' };
  
str = cell(size(e)); % preallocate output
for ii = 1:numel(e)
    str{ii} = parseBrackets_(e{ii});
end

function str = parseBrackets_( equation )
    bracketL = ( equation == '(' ); % indicies of opening brackets
    bracketR = ( equation == ')' ); % indicies of closing brackets
    str = {}; % intialise empty output
    if numel(bracketL) ~= numel(bracketR)
        % Validate the input
        warning( 'Could not match bracket pairs, count mismatch!' )
        return
    end
    
    nL = cumsum( bracketL ); % cumulative open bracket count
    nR = cumsum( bracketR ); % cumulative close bracket count
    nestLevel = nL - nR;     % nest level is number of open brackets not closed
    nestLevelChanged = diff(nestLevel); % Get the change points in nest level
    % get the points where the nest level changed to/from 1
    level1L = find( nestLevel == 1 & [true,nestLevelChanged==1] ) + 1; 
    level1R = find( nestLevel == 1 & [nestLevelChanged==-1,true] ); 
    
    % Compile cell array of terms within nest level 1 brackets
    str = arrayfun( @(x) equation(level1L(x):level1R(x)), 1:numel(level1L), 'uni', 0 );
end

输出:

str = 
    {'1 + exp(-2*n)'}
    {'1 + e'}
    {'3*(1 + exp(-2*n))'}
    {'1 + exp(-2*n)'}    {'2-5'}

相关问题