【问题标题】:Replacing ( string ) ^ 2 to sqrt ( string ) in Perl在 Perl 中将 (string) ^ 2 替换为 sqrt(string)
【发布时间】:2023-03-28 02:45:01
【问题描述】:

一个给定的字符串(称为$bbb!)包含许多操作数和运算符。我想替换每次出现 muth ( math ) ^ 2 mithmuth 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 ) )

【问题讨论】:

  • “muth”“math”和“mith”应该是一些任意字符串吗?还是它们是固定的字符串?
  • @user3761870,要匹配平衡括号,您需要一个递归模式。在 perlre 中搜索“递归”。展示你的作品。
  • 不清楚你的表达式是什么语言,但通常我希望 x ^ 2 与 sqrt(x) 不同。即 x ^ 2 = x * x 和 x ^ 0.5 = sqrt(x)。
  • @IanCook 我知道这很奇怪。在这种情况下,问题只是将^ 替换为**

标签: regex string perl replace pattern-matching


【解决方案1】:

嗯...奇怪的问题...

试试这个高级表达式

(?<math>\((?:[^()]+|(?&math))*\))\s*\^\s*2

希望图表能说明正在发生的事情

Debuggex Demo

替换字符串必须是sqrt $1

perl 中的命令如下所示

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

可以在此处找到一个运行示例:http://regex101.com/r/qU8dV0/3


关于这到底是什么的一些话

这里的主要结构是anything\s*\^\s*2,它匹配后面跟^2的任何东西

  • (?&lt;math&gt;...) 构建了一个名为 math 的模式
  • \(...\) 模式 math 必须以左括号开头并以右括号结尾
  • 括号内:
    • [^()]+ 允许使用除括号外的任何内容或
    • (?&amp;math) 另一个用已定义结构的括号包裹的术语是允许的,因此外部模式 math 被递归重复

【讨论】:

  • muth、math 和 mith 只是名称。它们是一些任意的表达式(或字符串)。如果我遗漏了什么,请告诉我——我是 Perl 的新手。这个$bbb =~ (?&lt;muth&gt;.*)(?&lt;math&gt;\((?:[^()]+|(?&amp;math))*\))\s*\^\s*2(?&lt;mith&gt;.*) 不起作用。
  • 请更明确一点,我如何将它与$bbb 合并。谢谢@bukfixart
  • 在 perl 中我不是更好,也许这会有所帮助$bbb =~ s/(?&lt;muth&gt;.*)(?&lt;math&gt;\((?:[^()]+|(?&amp;math))*\))\s*\^\s*2(?&lt;mith&gt;.*)/\1sqrt \2\3/
  • \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.
  • 不处理 ( ( a - 0.01 ) ^ 2 * ( a - 0.02 ) ) 或至少永远运行。无论如何,对于复杂的情况似乎很慢。
猜你喜欢
  • 1970-01-01
  • 2020-01-27
  • 2021-09-28
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2021-07-04
  • 1970-01-01
相关资源
最近更新 更多