所以我试图创建一个正则表达式而没有成功。
这就是我在输入字符串中得到的结果:
String A: "##(ABC 50a- {+} UDF 69,22g,-) {*} 3##"
String B: "##ABC 0,10,- DEF {/} 9 ABC {*} UHG 3-##"
这就是我需要处理的正则表达式:
Result A: "(50+69,22)*3"
String B: "0,10/9*3"
我无法将数字替换与操作符号结合使用。
这就是我得到的:
'/[^0-9\+\-\*\/\(\)\.]/'
感谢每一个帮助。
答案 0 :(得分:3)
一个简单的解决方案就是摆脱你不想要的一切。
所以替换这个:
\{(.+?)\}|[^0-9,{}()]+|(?<!\d),|,(?!\d)
$1
。
足够简单:
$input = "(ABC 50a- {+} UDF 69,22g,-) {*} 3";
$output = preg_replace('#\{(.+?)\}|[^0-9,{}()]+|(?<!\d),|,(?!\d)#', '$1', $input);
\{(.+?)\}
部分匹配{
... }
内的所有内容并输出它(它被$1
替换)[^0-9,{}()]+
摆脱了所有不属于我们要保留的角色(用空字符串代替)(?<!\d),|,(?!\d)
会抛出不属于数字的逗号不幸的是,如果没有更好的规格,我就无法说其他话。
答案 1 :(得分:2)
一个良好的开端是用文字记下你想要匹配的模式。例如,您已经说过,您知道这些操作位于{}
内,但在您第一次尝试使用正则表达式时,这并不会出现。
您也可以将其分解为单独的部分,然后再进行构建。例如,您可能会说:
+
,-
,*
或/
鉴于以上清单:
[()]
[0-9]
或\d
来匹配数字;至少有一个是+
;所以“数字”是\d+
,\d+
;使?
成为可选项,然后获得\d+(,\d+)?
[+*/-]
;转义/
和-
以获取[+*\/\-]
不要忘记{
和}
在正则表达式中具有特殊含义,因此需要转义为{{ 1}}和\{
;我们在大括号中的操作列表变为:\}
现在我们必须把它放在一起;一种方法是使用\{[+*\/\-]\}
按顺序查找任何这些模式的所有出现,然后我们可以将它们重新组合在一起。所以我们的正则表达式只是“这个或这个或这个或这个”:
preg_match_all
我没有对此进行过测试,但考虑到我是如何对其进行解释的,希望您可以弄清楚如何测试它的部分并在必要时进行调整。
答案 2 :(得分:1)
我不擅长正则表达式,但我找到了另一种方法:
在 eval 之前 EXTRA 检查输入!!!
$string = "(ABC 50a- {+} UDF 69,22g) {*} 3";
$new ='';
$string = str_split($string);
foreach($string as $char) {
if(!ctype_alnum($char) || ctype_digit($char) ){
//you don't want letters, except symbols like {, ( etc
$new .=$char;
}
}
//echo $new; will output -> ( 50- {+} 69,22) {*} 3
//remove the brackets although you could put it in the if statement ...
$new = str_replace(array('{','}'),array('',''), $new);
//floating point numbers use dot not comma
$new = str_replace(',','.', $new);
$p = eval('return '.$new.';');
print $p; // -57.66
已使用:ctype_digit,ctype_alnum,eval,str_split,str_replace
P.S:我认为考虑了基本操作之前的减号。
答案 3 :(得分:0)
离开办公室之前快速尝试一下; - )
$data = array(
"(ABC 50a- {+} UDF 69,22g) {*} 3",
"ABC 0,10- DEF {/} 9 ABC {*} UHG 3-"
);
foreach($data as $d) {
echo $d . " = " . extractFormula($d) . "\n";
}
function extractFormula($string) {
$regex = '/([()])|([0-9]+(,[0-9]+)?)|\{([+\*\/-])\}/';
preg_match_all($regex, $string, $matches);
$formula = implode(' ', $matches[0]);
$formula = str_replace(array('{', '}'),NULL,$formula);
return $formula;
}
输出:
(ABC 50a- {+} UDF 69,22g) {*} 3 = ( 50 + 69,22 ) * 3
ABC 0,10- DEF {/} 9 ABC {*} UHG 3- = 0,10 / 9 * 3
如果有人喜欢摆弄代码,这是一个实例:http://sandbox.onlinephpfunctions.com/code/373d76a9c0948314c1d164a555bed847f1a1ed0d