2014-03-18 66 views
2

如何在Matlab中找到匹配某個表達式的字符串中的最大可能模式。示例將闡明我的意思:正則表達式中的平衡括號

str = 'tan(sin*cos)'; 
str = 'tan(sin(exp)*cos(exp))'; 

我想查找模式,看起來像tan(\w*)。但我希望tan中的括號要平衡。有沒有辦法做到這一點?

+1

通常我會使用遞歸正則表達式'(R?)',但Matlab的文件中沒有提及。你有可能使用簡單的循環來計算括號,而不是使用正則表達式嗎? –

回答

1

沒有recusrsive正則表達式是不可能的。例如,這個字符串:

str = 'tan(tan(tan(x) + 4) + cos(x))' 

將必須「由內而外」 regex'ed,有些事只有遞歸可以做。必要時

regexprep(str, 'tan', '') 

和/或進一步分裂:

相反,我只是用一種更實用的解決方案。或者,正如範尼已經建議,只需使用一個循環:

str{1} = 'tan(x)'; 
str{2} = 'tan(sin(exp)*cos(exp)) + tan(tan(x) + 4)'; 

S = regexp(str, 'tan\('); 
match = cell(size(str)); 
[match{:}] = deal({}); 
for ii = 1:numel(str) 
    if ~isempty(S{ii}) 
     for jj = 1:numel(S{ii}) 

      open = false; 
      start = S{ii}(jj)+4; 
      for kk = start : numel(str{ii})    
       switch str{ii}(kk) 
        case '(' 
         open = true; 
        case ')' 
         if open 
          open = false; 
         else 
          match{ii}{end+1} = str{ii}(start:kk-1); 
          break; 
         end 
       end 
      end 
     end 
    end 
end