Регулярное выражение Matlab ${numberFun($4)} — Неопределенная функция ‘numberFun’ для входных аргументов типа ‘char’

#regex #matlab

Вопрос:

Я читал , что в Matlab можно включить вызов функции в преобразование регулярных выражений, подобное этому $1double$2[${doubleTextNumber($4)}] , предполагая, что 1, 2, 3 являются некоторыми группами регулярных выражений, а 4-чисто числовой группой. Именно то, что я хочу сделать, — это перехватить все массивы, состоящие из типа creal_T, заменить тип на double и удвоить длину массива.

 codeText = "typedef struct {
      double tolRob;
      creal_T Mt2o[704];
      creal_T Ho2o[704];
      creal_T Ht2t[704];
      creal_T Zo2t[704];
      creal_T Ztd[64];
 } testType;"
 

Итак, я хочу, чтобы вышеприведенная структура стала:

 typedef struct {
      double tolRob;
      double Mt2o[1408];
      double Ho2o[1408];
      double Ht2t[1408];
      double Zo2t[1408];
      double Ztd[128];
 } SpdEstType;
 

В Matlab я создал функцию для преобразования числа в текст и его удвоения:

 function [doubleValue] = doubleTextNumber(inputNumber)
    doubleValue =  string(str2double(inputNumber)*2.0);
end
 

У меня также есть регулярное выражение, которое, как я ожидаю, найдет число в каждом объявлении и передаст его функции:

 resultString = regexprep(
codeText,
'(?m)^(W*)creal_T(s*w*)([([^]]*d )])',
"$1double$2[${doubleTextNumber($4)}]");
 

Однако, когда я запускаю этот фрагмент кода, Matlab выдает мне следующую ошибку msg:

 Error using regexprep
Evaluation of 'doubleTextNumber($4)' failed:

Undefined function 'doubleTextNumber' for input arguments of type 'char'.
 

Насколько я понимаю, я заставил метод выполнить преобразование из char и ожидаю, что он также примет это значение из моего регулярного выражения. Я проверил, что это работает, когда я ввожу «704» или » 704 » напрямую, а также что регулярное выражение работает только после этой вставки.

Почему Matlab не находит функцию из моего регулярного выражения? (они находятся в одном файле m)

Комментарии:

1. Не должна ли она быть покрыта этой строкой из таблицы Операторов замены? ${cmd} | Output returned when MATLAB executes the command, cmd

2. Хорошо, я вижу, на этой странице есть несколько примеров.

Ответ №1:

Похоже, у меня было 3 проблемы с моим оригинальным подходом:

  1. Чтобы regexprep() распознать мою функцию, ее пришлось переместить в свой собственный m-файл. Простой вызов метода из одного и того же файла не сработал.
  2. Я использовал https://regex101.com/ для редактирования выражения поиска, но, несмотря на то, что, казалось, выбиралось число внутри скобок, группа 4 не была заполнена regexprep() в Matlab. Новая версия сработала и заполнила группу 3 нужными мне номерами: (?m)^(W*)creal_T(s*w*).([^]]*d*)]
  3. Я также добавил дополнительные параметры преобразования в свой метод умножения на случай, если входные данные представляли собой комбинацию чисел и массивов символов.

Окончательная версия моего вызова регулярного выражения становится:

 resultString = regexprep(
    codeText,
    '(?m)^(W*)creal_T(s*w*).([^]]*d*)]',
    "$1double$2[${multiplyTextNumbers($3,2)}]");
 

где multiplyTextNumbers() определяется в его собственном файле m как

 function [productText] = multiplyTextNumbers(inputFactorText1,inputFactorText2)
%MULTIPLY This method takes numbers as input, and acepts either string,
%char or double or any combination of the three. Returns a string with the
%resulting product. 
    if (isstring(inputFactorText1) || ischar(inputFactorText1))
        inputFactor1 = str2double(inputFactorText1);
    else
        inputFactor1 = inputFactorText1;
    end

    if (isstring(inputFactorText2) || ischar(inputFactorText2))
        inputFactor2 = str2double(inputFactorText2);
    else
        inputFactor2 = inputFactorText2;
    end

    productText =  sprintf('%d',inputFactor1*inputFactor2);
end
 

Надеюсь, это может быть полезно другим людям, сталкивающимся с подобными проблемами.