Замена (строки) ^ 2 на sqrt (строка) в Perl

#regex #string #perl #replace #pattern-matching

#регулярное выражение #строка #perl #заменить #сопоставление с шаблоном

Вопрос:

Данная строка (вызываемая $bbb !) содержит много операндов и операторов. Я хочу заменить каждое вхождение muth ( math ) ^ 2 mith на muth sqrt( math ) mith . (пробелов может быть больше одного).

РЕДАКТИРОВАТЬ: предположим, что во всем выражении есть только одно (simple linear expression) ^ 2 или ни одного — если это облегчает задачу.

Включительный пример:

1.2 * ( 4.7 * a * ( b - 0.02 ) ^ 2 * ( b - 0.02 1 ) / ( b - 0.0430 ) )

должно быть изменено на:

1.2 * ( 4.7 * a * sqrt( b - 0.02 ) * ( c - 0.02 1 ) / ( d - 0.0430 ) )

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

1. Предполагается, что «muth», «math» и «mith» — это какие-то произвольные строки? Или это фиксированные строки?

2. @user3761870, для соответствия сбалансированным скобкам вам понадобится рекурсивный шаблон. Найдите в perlre «рекурсивный». Покажите свою работу.

3. Неясно, на каком языке ваши выражения, но в целом я бы ожидал, что x ^ 2 будет отличаться от sqrt (x). т. Е. x ^ 2 = x * x и x ^ 0.5 = sqrt (x).

4. @IanCook Я знаю, что это странно. В этом случае проблема заключалась бы просто в замене ^ на ** .

Ответ №1:

Хорошо… странная проблема…

Попробуйте использовать это немного продвинутое выражение

 (?<math>((?:[^()] |(?amp;math))*))s*^s*2
  

Надеюсь, рисунок иллюстрирует, что происходит

Визуализация регулярного выражения

Демонстрация Debuggex

Строка замены должна быть sqrt $1

Команда в perl будет выглядеть следующим образом

 $bbb =~ s/(?<math>((?:[^()] |(?amp;math))*))s*^s*2/sqrt $1/
  

Работающий пример можно найти здесь:http://regex101.com/r/qU8dV0/3


несколько слов о том, что, черт возьми, это

основная структура здесь anythings*^s*2 , она соответствует всему, за чем следует ^2

  • (?<math>...) создает шаблон с именем math
  • (...) шаблон math должен начинаться с открывающей круглой скобки и заканчиваться закрывающей
  • в круглых скобках:
    • [^()] разрешено все, кроме скобок, или
    • (?amp;math) допускается другой заключенный в скобки термин с уже определенной структурой, поэтому внешний шаблон math рекурсивно повторяется

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

1. muth, math и mith были просто именами. Это некоторые произвольные выражения (или строки). Дайте мне знать, если я чего-то не понимаю — я новичок в Perl. Это $bbb =~ (?<muth>.*)(?<math>((?:[^()] |(?amp;math))*))s*^s*2(?<mith>.*) не сработало.

2. Пожалуйста, будьте более откровенны, как я могу включить это с $bbb . Спасибо @bukfixart

3. в perl я не лучше, может быть, это поможет $bbb =~ s/(?<muth>.*)(?<math>((?:[^()] |(?amp;math))*))s*^s*2(?<mith>.*)/1sqrt 23/

4. 1 better written as $1 at -e line 1. 2 better written as $2 at -e line 1. 3 better written as $3 at -e line 1.

5. Не обрабатывается ( ( a - 0.01 ) ^ 2 * ( a - 0.02 ) ) или, по крайней мере, выполняется вечно. В любом случае кажется очень медленным для сложных случаев.