所以我正在尝试创建一个正则表达式但没有成功。
这是我在输入字符串中得到的:
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-9,{}()]+|(?<!'d),|,(?!'d)
与$1
.
足够简单:
$input = "(ABC 50a- {+} UDF 69,22g,-) {*} 3";
$output = preg_replace('#'{(.+?)'}|[^0-9,{}()]+|(?<!'d),|,(?!'d)#', '$1', $input);
-
'{(.+?)'}
部分与{
内部的所有内容相匹配......}
并输出它(它被$1
替换( - 不属于我们试图保留的每个字符(它被替换为空字符串(
-
(?<!'d),|,(?!'d)
抛出不属于数字的逗号
[^0-9,{}()]+
删除了不幸的是,如果没有更好的规格,我不能说太多。
一个好的开始是用文字写下你想要匹配的模式。例如,您说过您知道操作在 {}
内部,但这在您第一次尝试正则表达式时不会出现在任何地方。
您还可以将其分解为单独的部分,然后稍后构建。例如,您可能会说:
- 如果您看到括号,请将其保留在最终答案中 数字由
- 任一数字组成...
- 。或数字后跟逗号和更多数字
- 操作始终在大括号中,并且是
+
、-
、*
或/
- 其他一切都应该扔掉
给定上面的列表:
- 匹配括号很容易:
[()]
- 匹配一个数字可以用
[0-9]
或'd
来完成;至少有一个是+
;所以"数字"是'd+
- 逗号数字很简单:
,'d+
; 用?
让它可选,你会得到'd+(,'d+)?
- 四个操作中的任何一个都是
[+*/-]
的;转义/
和-
以获得[+*'/'-]
不要忘记{
和}
在正则表达式中具有特殊含义,因此需要作为'{
和'}
进行转义;我们在大括号中的操作列表变为:'{[+*'/'-]'}
现在我们必须把它放在一起;一种方法是使用preg_match_all
来按顺序找到任何这些模式的所有出现,然后我们可以将它们重新组合在一起。所以我们的正则表达式只是"这个或这个或这个或这个":
/[()]|'d+(,'d+)?|'{[+*'/'-]'}/
我还没有测试过这个,但考虑到我是如何到达它的解释,希望你能弄清楚如何测试它的一部分并在必要时进行调整。
我不擅长正则表达式,但我找到了另一种方法:
在运行 eval 之前对输入进行额外检查!!
$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, 评估, str_split, str_replace
PS:我假设考虑了基本操作之前的减号。
在离开办公室之前快速尝试一下;-(
$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