Matlab: как заменить динамическую часть строки на regexprep - PullRequest
2 голосов
/ 10 октября 2019

У меня есть строки типа

@(foo) 5 + foo.^2
@(bar) bar(1,:) + bar(4,:)

, и я хочу, чтобы выражение в первой группе скобок (которое могло быть чем угодно) было заменено на x во всей строке

@(x) 5 + x.^2
@(x) x(1,:) + x(4,:)

Я думал, что это возможно как-то с regexprep за один шаг, но после прочтения документа и возни с этим довольно долго, я пока не нашел рабочего решения.

Я знаю, одинможно использовать две команды: во-первых, взять строку для сопоставления с regexp, а затем использовать ее с regexprep для замены всех вхождений.

Тем не менее, я чувствую, что это должно быть как-то возможно сфункциональность динамических выражений и токенов или тому подобное.

1 Ответ

1 голос
/ 10 октября 2019

Без поддержки вида бесконечной ширины вы не сможете сделать это за один шаг с помощью одного вызова regexprep.

Используйте первую идею: извлеките первое слово, а затем замените его на x при нахождении между границами слов:

s = '@(bar) bar(1,:) + bar(4,:)';
word = regexp(s, '^@\((\w+)\)','tokens'){1}{1};
s = regexprep(s, strcat('\<',word,'\>'), 'x');

Вывод: @(x) x(1,:) + x(4,:)

Регулярное выражение ^@\((\w+)\) соответствует @( в начале строки, затем захватывает буквенно-цифровые или_ вводится в группу 1 и затем соответствует ). Опция tokens позволяет получить доступ к захваченной подстроке, а затем часть strcat('\<',word,'\>') создает полное регулярное выражение для соответствия слова для команды regexprep.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...