我想操作一个字符串,比如“...4+3(4-2)-.”成为“...4+3*(4-2)-.”,但当然它应该识别任何数字,d,后面跟着a '(‘’,并将其改为'd*(‘)。如果可能的话,我也想同时更改)(“to”)*(“”)。如果有可能增加对pi或e这样的常量的支持,那就太好了。
就目前而言,我就是这么做的:
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或其他正则函数可以做得更好吗?但我认为,这些手册真的很难掌握。
发布于 2014-07-01 01:36:57
让我们从您正在寻找的内容开始:
(a|b)
将与a
或b
匹配) \d
)
:\)
(
:\(
它创建了这样的模式:(\d|\))\(
。但是,由于您希望修改字符串并保留这两个部分,所以可以对\(
进行分组,这将导致(\()
的读取变得更糟,但更好地处理。
现在剩下的一切就是告诉您如何重新排列,这很简单:\\1*\\2
,留给您这样的代码
$regex = "/(\d|\))(\()/";
$replace = "\\1*\\2";
$new = preg_replace($regex, $replace, $test);
要查看该模式实际上匹配所有情况,请参见这个例子。
发布于 2014-07-01 01:38:02
要识别(
或)(
组合后面的任何数字,并在它们之间放置星号,可以使用环顾四周断言的组合。
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
重置报告的匹配的起点。以前使用过的任何字符都不再包括在内(丢弃它在此之前匹配的所有字符。)
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)');
发布于 2014-07-01 01:36:15
你的php代码应该是,
<?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
https://stackoverflow.com/questions/24501213
复制相似问题