#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
Надеюсь, рисунок иллюстрирует, что происходит
Строка замены должна быть 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
. Спасибо @bukfixart3. в 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 ) )
или, по крайней мере, выполняется вечно. В любом случае кажется очень медленным для сложных случаев.