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