首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何操作字符串,以便在数学表达式中使隐式乘法显式化?

如何操作字符串,以便在数学表达式中使隐式乘法显式化?
EN

Stack Overflow用户
提问于 2014-07-01 01:22:53
回答 4查看 169关注 0票数 4

我想操作一个字符串,比如“...4+3(4-2)-.”成为“...4+3*(4-2)-.”,但当然它应该识别任何数字,d,后面跟着a '(‘’,并将其改为'd*(‘)。如果可能的话,我也想同时更改)(“to”)*(“”)。如果有可能增加对pi或e这样的常量的支持,那就太好了。

就目前而言,我就是这么做的:

代码语言:javascript
运行
复制
private function make_implicit_multiplication_explicit($string)
{
    $i=1;
    if(strlen($string)>1)
    {
        while(($i=strpos($string,"(",$i))!==false)
        {
            if(strpos("0123456789",substr($string,$i-1,1))) 
            {
                $string=substr_replace($string,"*(",$i,1);
                $i++;
            }
            $i++;
        }

        $string=str_replace(")(",")*(",$string);
    }        
    return $string;
 }

但我相信用preg_replace或其他正则函数可以做得更好吗?但我认为,这些手册真的很难掌握。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-01 01:36:57

让我们从您正在寻找的内容开始:

  • ((a|b)将与ab匹配)
    • 任何数字,\d
    • 字符)\)

  • 其次是(\(

它创建了这样的模式:(\d|\))\(。但是,由于您希望修改字符串并保留这两个部分,所以可以对\(进行分组,这将导致(\()的读取变得更糟,但更好地处理。

现在剩下的一切就是告诉您如何重新排列,这很简单:\\1*\\2,留给您这样的代码

代码语言:javascript
运行
复制
$regex = "/(\d|\))(\()/";
$replace = "\\1*\\2";
$new = preg_replace($regex, $replace, $test);

要查看该模式实际上匹配所有情况,请参见这个例子

票数 5
EN

Stack Overflow用户

发布于 2014-07-01 01:38:02

要识别( )(组合后面的任何数字,并在它们之间放置星号,可以使用环顾四周断言的组合。

代码语言:javascript
运行
复制
echo preg_replace("/

         (?<=[0-9)])   # look behind to see if there is: '0' to '9', ')'
         (?=\()        # look ahead to see if there is: '('

         /x", '*', '(4+3(4-2)-3)(2+3)'); 

积极后视断言前面要么是数字,要么是右括号。而积极展望断言前面的字符后面有一个左括号。

另一种选择是使用\K转义序列替换Lookbehind。\K重置报告的匹配的起点。以前使用过的任何字符都不再包括在内(丢弃它在此之前匹配的所有字符。)

代码语言:javascript
运行
复制
echo preg_replace("/

         [0-9)]   # any character of: '0' to '9', ')'
          \K      # resets the starting point of the reported match
          (?=\()  # look ahead to see if there is: '('

         /x", '*', '(4+3(4-2)-3)(2+3)'); 
票数 4
EN

Stack Overflow用户

发布于 2014-07-01 01:36:15

你的php代码应该是,

代码语言:javascript
运行
复制
<?php
$mystring = "4+3(4-2)-(5)(3)";
$regex = '~\d+\K\(~';
$replacement = "*(";
$str = preg_replace($regex, $replacement, $mystring);
$regex1 = '~\)\K\(~';
$replacement1 = "*(";
echo preg_replace($regex1, $replacement1, $str);
?> //=>  4+3*(4-2)-(5)*(3)

解释:

  • ~\d+\K\(~ --这将匹配一个或多个数字,后面跟着一个(。因为\K它不包括\d+
  • 同样,它将匹配的部分替换为*(,后者反过来生成3*(,结果存储在另一个变量中。
  • \)\K\()(匹配,并排除第一个)。这将被*(所取代,后者反过来产生)*(

演示1

演示2

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24501213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档