Nsystem
@Nsystem

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

かっこの外で「+」と「ー」とで分割する方法を教えてください

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

1Answer

やり方は色々とありそうですが、とりあえず思いついたものを。
正規表現は見栄えのために 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))"));
0Like

Comments

  1. @Nsystem

    Questioner

    ありがとうございます🙇‍♂
    これがしたかったんです!やっぱ正規表現は難しい、、。
    あとで試してみます。
    本当にありがとうございました!!

Your answer might help someone💌