かっこの外で「+」と「ー」とで分割する方法を教えてください
Q&A
解決したいこと
PHP で 正規表現とかで、(3 ÷ 2) - (4 + 5)
の(
と)
の外で+
と-
で分割するにはどうすればいいですか。
例えば、
2a+(3÷2)-(4+5)
を
array(3) {
[0]=> string(2) "2a"
[1]=> string(7) "+(3÷2)"
[2]=> string(6) "-(4+5)"
}
にしたいです
0
Q&A
PHP で 正規表現とかで、(3 ÷ 2) - (4 + 5)
の(
と)
の外で+
と-
で分割するにはどうすればいいですか。
例えば、
2a+(3÷2)-(4+5)
を
array(3) {
[0]=> string(2) "2a"
[1]=> string(7) "+(3÷2)"
[2]=> string(6) "-(4+5)"
}
にしたいです
やり方は色々とありそうですが、とりあえず思いついたものを。
正規表現は見栄えのために x
オプション (空白無視) を使用しています。
/* $pattern = "/([+-]?(?:\((?>[^)]+)\)|[^(+-])*)/"; */
$pattern = "/(
[+-]?
(?:
\( (?>[^)]+) \) |
[^(+-]
)*
)/x";
$string = "2a+(3÷2)-(4+5)";
$result = preg_split(
$pattern,
$string,
-1,
PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY
);
var_dump($result);
/* $pattern = "/([+-]?(?:\((?:(?>[^)]+)|\((?-1)\))*\)|[^(+-])*)/"; */
$pattern = "/(
[+-]?
(?:
\( (?: (?>[^)]+) | \( (?-1) \) )* \) |
[^(+-]
)*
)/x";
$string = "2a+(3÷2)-(4+5+(1+2))";
$result = preg_split(
$pattern,
$string,
-1,
PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY
);
var_dump($result);
function split_expr($string) {
$level = 0;
$offset = 0;
$result = [];
for ($i = 0; $i < strlen($string); $i++) {
switch($string[$i]) {
case '(':
$level++;
break;
case ')':
$level--;
break;
case '+':
case '-':
if ($level === 0) {
$result[] = substr($string, $offset, $i - $offset);
$offset = $i;
}
break;
}
}
$result[] = substr($string, $offset);
return $result;
}
var_dump(split_expr("2a+(3÷2)-(4+5)"));
var_dump(split_expr("(a+b)+(c+d)+(e+(f+g))"));
@Nsystem
Questioner